summaryrefslogtreecommitdiff
path: root/lib/vendors/service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-18 01:44:39 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-18 01:44:39 +0000
commit69fd0851bb1bc1d767d50eecef044e20f325a8fa (patch)
treeb3050a07a04288bb12de52e0b9a42012372bd908 /lib/vendors/service.ts
parentcf8dac0c6490469dab88a560004b0c07dbd48612 (diff)
(최겸) 구매 PQ 요청 시 기본계약 통합 단일 이메일 발송 건 수정
Diffstat (limited to 'lib/vendors/service.ts')
-rw-r--r--lib/vendors/service.ts129
1 files changed, 103 insertions, 26 deletions
diff --git a/lib/vendors/service.ts b/lib/vendors/service.ts
index 45a0e0b5..9a37f5d7 100644
--- a/lib/vendors/service.ts
+++ b/lib/vendors/service.ts
@@ -2943,32 +2943,7 @@ export async function requestBasicContractInfo({
})
.returning();
- // 3-2. 협력업체에 이메일 발송
- const subject = `[${process.env.COMPANY_NAME || '회사명'}] 기본계약서 서명 요청`;
-
- const headersList = await headers();
- const host = headersList.get('host') || 'localhost:3000';
- // 로그인 또는 서명 페이지 URL 생성
- const baseUrl = process.env.NEXT_PUBLIC_URL || `http://${host}`;
- const loginUrl = `${baseUrl}/partners/basic-contract`;
- console.log("loginUrl-basic-contract", loginUrl);
-
- // 사용자 언어 설정 (기본값은 한국어)
- const userLang = "ko";
-
- // 이메일 발송
- await sendEmail({
- to: vendor.email,
- subject,
- template: "contract-sign-request", // 이메일 템플릿 이름
- context: {
- vendorName: vendor.vendorName,
- contractId: newContract.id,
- templateName: template.templateName,
- loginUrl,
- language: userLang,
- },
- });
+ // 이메일 발송은 별도 함수(sendBasicContractEmail)에서 처리
return { vendorId: vendor.id, success: true };
} catch (err) {
@@ -3016,6 +2991,108 @@ export async function requestBasicContractInfo({
}
/**
+ * 기본계약서 이메일 발송 함수
+ * 협력업체당 하나의 이메일만 발송하며, 전달받은 템플릿 정보를 포함
+ */
+export async function sendBasicContractEmail({
+ vendorIds,
+ templateIds,
+ requestedBy
+}: {
+ vendorIds: number[];
+ templateIds: number[];
+ requestedBy: number;
+}): Promise<{ success?: boolean; error?: string }> {
+ if (!vendorIds || vendorIds.length === 0) {
+ return { error: "협력업체 ID가 제공되지 않았습니다." };
+ }
+
+ if (!templateIds || templateIds.length === 0) {
+ return { error: "템플릿 ID가 제공되지 않았습니다." };
+ }
+
+ try {
+ // 협력업체 정보 가져오기
+ const vendorList = await db
+ .select()
+ .from(vendors)
+ .where(inArray(vendors.id, vendorIds));
+
+ if (!vendorList || vendorList.length === 0) {
+ return { error: "선택한 협력업체 정보를 찾을 수 없습니다." };
+ }
+
+ // 템플릿 정보 가져오기
+ const templateList = await db
+ .select()
+ .from(basicContractTemplates)
+ .where(inArray(basicContractTemplates.id, templateIds));
+
+ if (!templateList || templateList.length === 0) {
+ return { error: "선택한 템플릿 정보를 찾을 수 없습니다." };
+ }
+
+ // 각 협력업체에 이메일 발송
+ const emailResults = await Promise.all(
+ vendorList.map(async (vendor) => {
+ if (!vendor.email) return { vendorId: vendor.id, success: true }; // 이메일이 없으면 스킵
+
+ try {
+ const subject = `기본계약서 서명 요청`;
+
+ const headersList = await headers();
+ const host = headersList.get('host') || 'localhost:3000';
+ const baseUrl = process.env.NEXT_PUBLIC_URL || `http://${host}`;
+ const loginUrl = `${baseUrl}/partners/basic-contract`;
+
+ // 사용자 언어 설정 (기본값은 한국어)
+ const userLang = "ko";
+
+ // 이메일 발송 (요청된 템플릿 정보 포함)
+ await sendEmail({
+ to: vendor.email,
+ subject,
+ template: "contract-sign-request",
+ context: {
+ vendorName: vendor.vendorName,
+ templates: templateList, // 요청된 템플릿 목록
+ templateCount: templateList.length,
+ loginUrl,
+ language: userLang,
+ },
+ });
+
+ return { vendorId: vendor.id, success: true };
+ } catch (err) {
+ console.error(`협력업체 ${vendor.id} 이메일 발송 중 오류:`, err);
+ return { vendorId: vendor.id, success: false, error: getErrorMessage(err) };
+ }
+ })
+ );
+
+ // 실패한 이메일 발송 확인
+ const failedEmails = emailResults.filter(r => !r.success);
+
+ if (failedEmails.length > 0) {
+ console.error("일부 협력업체 이메일 발송 실패:", failedEmails);
+ return {
+ success: true,
+ error: `${emailResults.length - failedEmails.length}개 협력업체 이메일 발송 성공, ${failedEmails.length}개 실패`
+ };
+ }
+
+ return { success: true };
+ } catch (error) {
+ console.error("기본계약서 이메일 발송 중 오류 발생:", error);
+ return {
+ error: error instanceof Error
+ ? error.message
+ : "기본계약서 이메일 발송 중 오류가 발생했습니다."
+ };
+ }
+}
+
+/**
* 비밀유지 계약서 첨부파일 저장 서버 액션
*/
export async function saveNdaAttachments(input: {