diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-04-28 02:13:30 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-04-28 02:13:30 +0000 |
| commit | ef4c533ebacc2cdc97e518f30e9a9350004fcdfb (patch) | |
| tree | 345251a3ed0f4429716fa5edaa31024d8f4cb560 /lib/mail | |
| parent | 9ceed79cf32c896f8a998399bf1b296506b2cd4a (diff) | |
~20250428 작업사항
Diffstat (limited to 'lib/mail')
21 files changed, 952 insertions, 722 deletions
diff --git a/lib/mail/layouts/base.hbs b/lib/mail/layouts/base.hbs new file mode 100644 index 00000000..2e18f035 --- /dev/null +++ b/lib/mail/layouts/base.hbs @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <title>{{subject}}</title> + </head> + <body style="margin:0; padding:20px; background-color:#f5f5f5; font-family:Arial, sans-serif; color:#111827;"> + <table width="100%" cellpadding="0" cellspacing="0" border="0" align="center"> + <tr> + <td align="center"> + <table width="600" cellpadding="0" cellspacing="0" border="0" style="background-color:#ffffff; border:1px solid #e5e7eb; border-radius:6px; padding:24px;"> + <tr> + <td> + {{{body}}} + </td> + </tr> + </table> + </td> + </tr> + </table> + </body> +</html> diff --git a/lib/mail/mailer.ts b/lib/mail/mailer.ts index 200a0ed9..3474a373 100644 --- a/lib/mail/mailer.ts +++ b/lib/mail/mailer.ts @@ -15,14 +15,45 @@ const transporter = nodemailer.createTransport({ }, }); -// Handlebars 템플릿 로더 함수 -function loadTemplate(templateName: string, data: Record<string, any>) { +// // Handlebars 템플릿 로더 함수 +// function loadTemplate(templateName: string, data: Record<string, any>) { +// const templatePath = path.join(process.cwd(), 'lib', 'mail', 'templates', `${templateName}.hbs`); +// const source = fs.readFileSync(templatePath, 'utf8'); +// const template = handlebars.compile(source); +// return template(data); +// } +function applyLayout(layoutName: string, content: string, context: Record<string, any>) { + const layoutPath = path.join(process.cwd(), 'lib', 'mail', 'layouts', `${layoutName}.hbs`); + const layoutSource = fs.readFileSync(layoutPath, 'utf8'); + const layoutTemplate = handlebars.compile(layoutSource); + return layoutTemplate({ ...context, body: content }); +} + +// Partials 자동 등록 +function registerPartials() { + const partialsDir = path.join(process.cwd(), 'lib', 'mail', 'partials'); + const filenames = fs.readdirSync(partialsDir); + + filenames.forEach((filename) => { + const name = path.parse(filename).name; + const filepath = path.join(partialsDir, filename); + const source = fs.readFileSync(filepath, 'utf8'); + handlebars.registerPartial(name, source); // {{> header }}, {{> footer }} + }); +} + + +// 템플릿 불러오기 + layout/partials 적용 +function loadTemplate(templateName: string, context: Record<string, any>, layout = 'base') { + registerPartials(); + const templatePath = path.join(process.cwd(), 'lib', 'mail', 'templates', `${templateName}.hbs`); const source = fs.readFileSync(templatePath, 'utf8'); const template = handlebars.compile(source); - return template(data); -} + const content = template(context); // 본문 먼저 처리 + return applyLayout(layout, content, context); // base.hbs로 감싸기 +} handlebars.registerHelper('t', function(key: string, options: any) { // options.hash에는 Handlebars에서 넘긴 named parameter들(location=location 등)이 들어있음 return i18next.t(key, options.hash || {}); diff --git a/lib/mail/partials/footer.hbs b/lib/mail/partials/footer.hbs new file mode 100644 index 00000000..06aae57d --- /dev/null +++ b/lib/mail/partials/footer.hbs @@ -0,0 +1,8 @@ +<table width="100%" cellpadding="0" cellspacing="0" style="margin-top:32px; border-top:1px solid #e5e7eb; padding-top:16px;"> + <tr> + <td align="center"> + <p style="font-size:16px; color:#6b7280; margin:4px 0;">© {{currentYear}} EVCP. {{t "email.vendor.invitation.copyright"}}</p> + <p style="font-size:16px; color:#6b7280; margin:4px 0;">{{t "email.vendor.invitation.no_reply"}}</p> + </td> + </tr> +</table> diff --git a/lib/mail/partials/header.hbs b/lib/mail/partials/header.hbs new file mode 100644 index 00000000..7898c82e --- /dev/null +++ b/lib/mail/partials/header.hbs @@ -0,0 +1,7 @@ +<table width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:24px; border-bottom:1px solid #163CC4; padding-bottom:16px;"> + <tr> + <td align="center"> + <span style="display: block; text-align: left; color: #163CC4; font-weight: bold; font-size: 32px;">eVCP</span> + </td> + </tr> +</table> diff --git a/lib/mail/templates/admin-created.hbs b/lib/mail/templates/admin-created.hbs index 7be7f15d..3db6c433 100644 --- a/lib/mail/templates/admin-created.hbs +++ b/lib/mail/templates/admin-created.hbs @@ -1,78 +1,25 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8" /> - <title>{{t "adminCreated.title" lng=language}}</title> - <style> - /* 간단한 스타일 예시 */ - body { - font-family: Arial, sans-serif; - margin: 0; - padding: 16px; - background-color: #f5f5f5; - } - .container { - max-width: 600px; - margin: 0 auto; - background-color: #ffffff; - padding: 24px; - border-radius: 8px; - } - h1 { - font-size: 20px; - margin-bottom: 16px; - } - p { - font-size: 14px; - line-height: 1.6; - } - .btn { - display: inline-block; - margin-top: 16px; - padding: 12px 24px; - background-color: #1D4ED8; - color: #ffffff !important; - text-decoration: none; - border-radius: 4px; - } - .footer { - margin-top: 24px; - font-size: 12px; - color: #888888; - } - </style> - </head> - <body> - <div class="container"> - <!-- 상단 로고/타이틀 영역 --> - <div style="text-align: center;"> - <!-- 필요 시 로고 이미지 --> - <!-- <img src="https://your-logo-url.com/logo.png" alt="EVCP" width="120" /> --> - </div> +{{> header logoUrl=logoUrl }} - <h1>{{t "adminCreated.title" lng=language}}</h1> +<h1 style="font-size:28px; margin-bottom:16px;"> + {{t "adminCreated.title" lng=language}} +</h1> - <p> - {{t "adminCreated.greeting" lng=language}}, <strong>{{name}}</strong>. - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "adminCreated.greeting" lng=language}}, <strong>{{name}}</strong>. +</p> - <p> - {{t "adminCreated.body1" lng=language}} - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "adminCreated.body1" lng=language}} +</p> - <p> - <a class="btn" href="{{loginUrl}}" target="_blank">{{t "adminCreated.loginCTA" lng=language}}</a> - </p> +<p> + <a href="{{loginUrl}}" target="_blank" style="display: inline-block; width: 250px; padding: 12px 20px; background-color: #163CC4; color: #ffffff !important; text-decoration: none; border-radius: 8px; text-align: center; line-height: 28px; margin-top: 16px;"> + {{t "adminCreated.loginCTA" lng=language}} + </a> +</p> - <p> - {{t "adminCreated.supportMsg" lng=language}} - </p> +<p style="font-size:16px; line-height:24px; margin-top:16px;"> + {{t "adminCreated.supportMsg" lng=language}} +</p> - <div class="footer"> - <p> - {{t "adminCreated.footerDisclaimer" lng=language}} - </p> - </div> - </div> - </body> -</html>
\ No newline at end of file +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/admin-email-changed.hbs b/lib/mail/templates/admin-email-changed.hbs index 7b8ca473..fb88feab 100644 --- a/lib/mail/templates/admin-email-changed.hbs +++ b/lib/mail/templates/admin-email-changed.hbs @@ -1,90 +1,30 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8" /> - <title>{{t "adminEmailChanged.title" lng=language}}</title> - <style> - /* 간단한 스타일 예시 */ - body { - font-family: Arial, sans-serif; - margin: 0; - padding: 16px; - background-color: #f5f5f5; - } - .container { - max-width: 600px; - margin: 0 auto; - background-color: #ffffff; - padding: 24px; - border-radius: 8px; - } - h1 { - font-size: 20px; - margin-bottom: 16px; - } - p { - font-size: 14px; - line-height: 1.6; - } - .btn { - display: inline-block; - margin-top: 16px; - padding: 12px 24px; - background-color: #1D4ED8; - color: #ffffff !important; - text-decoration: none; - border-radius: 4px; - } - .footer { - margin-top: 24px; - font-size: 12px; - color: #888888; - } - </style> - </head> - <body> - <div class="container"> - <!-- 상단 로고/타이틀 영역 --> - <div style="text-align: center;"> - <!-- 필요 시 로고 이미지 --> - <!-- <img src="https://your-logo-url.com/logo.png" alt="EVCP" width="120" /> --> - </div> +{{> header logoUrl=logoUrl }} - <!-- 메일 제목 --> - <h1>{{t "adminEmailChanged.title" lng=language}}</h1> +<h1 style="font-size:28px; margin-bottom:16px;"> + {{t "adminEmailChanged.title" lng=language}} +</h1> - <!-- 인사말 --> - <p> - {{t "adminEmailChanged.greeting" lng=language}}, <strong>{{name}}</strong>. - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "adminEmailChanged.greeting" lng=language}}, <strong>{{name}}</strong>. +</p> - <!-- 이전 이메일 / 새 이메일 안내 --> - <p> - {{t "adminEmailChanged.body.intro" lng=language}} - </p> - <p> - <strong>{{t "adminEmailChanged.body.oldEmail" lng=language}}:</strong> {{oldEmail}}<br /> - <strong>{{t "adminEmailChanged.body.newEmail" lng=language}}:</strong> {{newEmail}} - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:8px;"> + {{t "adminEmailChanged.body.intro" lng=language}} +</p> - <!-- 버튼(로그인 / 대시보드 등) --> - <p> - <a class="btn" href="{{loginUrl}}" target="_blank"> - {{t "adminEmailChanged.loginCTA" lng=language}} - </a> - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + <strong>{{t "adminEmailChanged.body.oldEmail" lng=language}}:</strong> {{oldEmail}}<br /> + <strong>{{t "adminEmailChanged.body.newEmail" lng=language}}:</strong> {{newEmail}} +</p> - <!-- 도움 요청 문구 --> - <p> - {{t "adminEmailChanged.supportMsg" lng=language}} - </p> +<p> + <a href="{{loginUrl}}" target="_blank" style="display: inline-block; width: 250px; padding: 12px 20px; background-color: #163CC4; color: #ffffff !important; text-decoration: none; border-radius: 8px; text-align: center; line-height: 28px; margin-top: 16px;"> + {{t "adminEmailChanged.loginCTA" lng=language}} + </a> +</p> - <!-- 푸터 --> - <div class="footer"> - <p> - {{t "adminEmailChanged.footerDisclaimer" lng=language}} - </p> - </div> - </div> - </body> -</html>
\ No newline at end of file +<p style="font-size:16px; line-height:24px; margin-top:16px;"> + {{t "adminEmailChanged.supportMsg" lng=language}} +</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/cbe-invitation.hbs b/lib/mail/templates/cbe-invitation.hbs new file mode 100644 index 00000000..1d5e8eba --- /dev/null +++ b/lib/mail/templates/cbe-invitation.hbs @@ -0,0 +1,108 @@ +{{#> layout title="상업 입찰 평가 (CBE) 알림"}} + <p style="font-size:16px;">안녕하세요, <strong>{{contactName}}</strong>님</p> + + <p style="font-size:16px;"><strong>[RFQ {{rfqCode}}]</strong>에 대한 상업 입찰 평가(CBE)가 생성되어 알려드립니다. + 아래 세부 정보를 확인하시고 필요한 조치를 취해주시기 바랍니다.</p> + + <div class="info-box" style="background-color:#F1F5F9; border-radius:6px; padding:16px; margin-bottom:20px;"> + <h3 style="font-size:20px; color:#163CC4; margin-top:0; margin-bottom:12px;">RFQ 정보</h3> + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">RFQ 코드:</span> {{rfqCode}}</div> + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">프로젝트 코드:</span> {{projectCode}}</div> + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">프로젝트명:</span> {{projectName}}</div> + {{#if dueDate}} + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">마감일:</span> {{dueDate}}</div> + {{/if}} + </div> + + <div class="info-box" style="background-color:#F1F5F9; border-radius:6px; padding:16px; margin-bottom:20px;"> + <h3 style="font-size:20px; color:#163CC4; margin-top:0; margin-bottom:12px;">CBE 평가 세부사항</h3> + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">협력업체:</span> {{vendorName}} ({{vendorCode}})</div> + {{#if paymentTerms}} + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">결제 조건:</span> {{paymentTerms}}</div> + {{/if}} + {{#if incoterms}} + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">Incoterms:</span> {{incoterms}}</div> + {{/if}} + {{#if deliverySchedule}} + <div class="info-item" style="margin-bottom:8px;"><span class="label" style="font-weight:bold; color:#4B5563;">배송 일정:</span> {{deliverySchedule}}</div> + {{/if}} + </div> + + {{#if description}} + <div class="info-box" style="background-color:#F1F5F9; border-radius:6px; padding:16px; margin-bottom:20px;"> + <h3 style="font-size:20px; color:#163CC4; margin-top:0; margin-bottom:12px;">RFQ 설명</h3> + <p style="font-size:16px; margin:0;">{{description}}</p> + </div> + {{/if}} + + {{#if notes}} + <div class="info-box" style="background-color:#F1F5F9; border-radius:6px; padding:16px; margin-bottom:20px;"> + <h3 style="font-size:20px; color:#163CC4; margin-top:0; margin-bottom:12px;">비고</h3> + <p style="font-size:16px; margin:0;">{{notes}}</p> + </div> + {{/if}} + + <p style="text-align: center; margin: 25px 0;"> + <a href="{{loginUrl}}/rfq/{{rfqId}}/cbe/{{cbeId}}" class="button" style="display:inline-block; background-color:#163CC4; color:#ffffff; padding:10px 20px; text-decoration:none; border-radius:4px; font-weight:bold;"> + CBE 평가 확인하기 + </a> + </p> + + <p style="font-size:16px;">이 이메일에 첨부된 파일을 확인하시거나, 시스템에 로그인하여 자세한 정보를 확인해 주세요. + 추가 문의사항이 있으시면 구매담당자에게 연락해 주시기 바랍니다.</p> + + <p style="font-size:16px;">감사합니다.<br />eVCP 팀</p> +{{/layout}} +{{!-- {{#> layout title="상업 입찰 평가 (CBE) 알림"}} + <p>안녕하세요, <strong>{{contactName}}</strong>님</p> + + <p><strong>[RFQ {{rfqCode}}]</strong>에 대한 상업 입찰 평가(CBE)가 생성되어 알려드립니다. + 아래 세부 정보를 확인하시고 필요한 조치를 취해주시기 바랍니다.</p> + + <div class="info-box"> + <h3>RFQ 정보</h3> + <div class="info-item"><span class="label">RFQ 코드:</span> {{rfqCode}}</div> + <div class="info-item"><span class="label">프로젝트 코드:</span> {{projectCode}}</div> + <div class="info-item"><span class="label">프로젝트명:</span> {{projectName}}</div> + {{#if dueDate}} + <div class="info-item"><span class="label">마감일:</span> {{dueDate}}</div> + {{/if}} + </div> + + <div class="info-box"> + <h3>CBE 평가 세부사항</h3> + <div class="info-item"><span class="label">협력업체:</span> {{vendorName}} ({{vendorCode}})</div> + {{#if paymentTerms}} + <div class="info-item"><span class="label">결제 조건:</span> {{paymentTerms}}</div> + {{/if}} + {{#if incoterms}} + <div class="info-item"><span class="label">Incoterms:</span> {{incoterms}}</div> + {{/if}} + {{#if deliverySchedule}} + <div class="info-item"><span class="label">배송 일정:</span> {{deliverySchedule}}</div> + {{/if}} + </div> + + {{#if description}} + <div class="info-box"> + <h3>RFQ 설명</h3> + <p>{{description}}</p> + </div> + {{/if}} + + {{#if notes}} + <div class="info-box"> + <h3>비고</h3> + <p>{{notes}}</p> + </div> + {{/if}} + + <div class="button-container"> + <a href="{{loginUrl}}/rfq/{{rfqId}}/cbe/{{cbeId}}" class="button"> + CBE 평가 확인하기 + </a> + </div> + + <p>이 이메일에 첨부된 파일을 확인하시거나, 시스템에 로그인하여 자세한 정보를 확인해 주세요. + 추가 문의사항이 있으시면 구매담당자에게 연락해 주시기 바랍니다.</p> +{{/layout}} --}}
\ No newline at end of file diff --git a/lib/mail/templates/contract-sign-request.hbs b/lib/mail/templates/contract-sign-request.hbs new file mode 100644 index 00000000..410fdf6a --- /dev/null +++ b/lib/mail/templates/contract-sign-request.hbs @@ -0,0 +1,116 @@ +<!DOCTYPE html> +<html lang="{{language}}"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>기본계약서 서명 요청</title> + <style> + body { + font-family: 'Malgun Gothic', 'Segoe UI', sans-serif; + line-height: 1.6; + color: #333; + background-color: #f9f9f9; + margin: 0; + padding: 0; + } + .container { + max-width: 600px; + margin: 0 auto; + padding: 20px; + background-color: #ffffff; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + } + .header { + text-align: center; + padding-bottom: 20px; + border-bottom: 1px solid #eee; + } + .logo { + max-height: 60px; + margin-bottom: 10px; + } + .content { + padding: 30px 20px; + } + .footer { + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid #eee; + font-size: 12px; + color: #666; + text-align: center; + } + .button { + display: inline-block; + background-color: #4F46E5; + color: white; + text-decoration: none; + padding: 12px 24px; + border-radius: 4px; + margin: 20px 0; + font-weight: bold; + } + .button:hover { + background-color: #4338CA; + } + .info-box { + background-color: #f3f4f6; + border-radius: 4px; + padding: 15px; + margin: 20px 0; + } + @media only screen and (max-width: 600px) { + .container { + width: 100%; + border-radius: 0; + } + } + </style> +</head> +<body> + <div class="container"> + <div class="header"> + <img src="{{logoUrl}}" alt="회사 로고" class="logo"> + <h1>기본계약서 서명 요청</h1> + </div> + + <div class="content"> + <p>안녕하세요, <strong>{{vendorName}}</strong>님.</p> + + <p>귀사에 기본계약서 서명을 요청드립니다.</p> + + <div class="info-box"> + <p><strong>계약서 정보:</strong></p> + <p>계약서 종류: {{templateName}}</p> + <p>계약 번호: {{contractId}}</p> + </div> + + <p>아래 버튼을 클릭하여 계약서를 확인하고 서명해 주시기 바랍니다.</p> + + <div style="text-align: center;"> + <a href="{{loginUrl}}" class="button">계약서 서명하기</a> + </div> + + <p>본 링크는 30일간 유효하며, 이후에는 새로운 서명 요청이 필요합니다.</p> + + <p>서명 과정에서 문의사항이 있으시면 담당자에게 연락해 주시기 바랍니다.</p> + + <p>감사합니다.</p> + + <div style="margin-top: 30px;"> + <p><strong>담당자 연락처:</strong><br> + 이메일: contact@company.com<br> + 전화: 02-123-4567</p> + </div> + </div> + + <div class="footer"> + <p>본 메일은 발신 전용으로, 회신하실 경우 확인이 어려울 수 있습니다.</p> + <p>© {{currentYear}} 주식회사 회사명. 모든 권리 보유.</p> + <p>이 이메일에 포함된 정보는 기밀 정보이며, 특정 수신자만을 위한 것입니다. + 만약 귀하가 의도된 수신자가 아닌 경우, 본 이메일의 사용, 배포 또는 복사는 엄격히 금지됩니다.</p> + </div> + </div> +</body> +</html>
\ No newline at end of file diff --git a/lib/mail/templates/investigation-request.hbs b/lib/mail/templates/investigation-request.hbs new file mode 100644 index 00000000..a69091a5 --- /dev/null +++ b/lib/mail/templates/investigation-request.hbs @@ -0,0 +1,31 @@ +{{> header logoUrl=logoUrl }} + +<h2 style="font-size:28px; margin-bottom:16px;"> 협력업체 실사 요청</h2> + +<p style="font-size:16px;">안녕하세요,</p> + +<p style="font-size:16px;">협력업체 실사 요청이 접수되었습니다.</p> + +<div style="background-color:#F1F5F9; padding:16px; border-radius:4px; margin:16px 0;"> + <p style="font-size:16px; margin:0 0 8px 0;"><strong>협력업체 ID:</strong></p> + <ul style="margin:0; padding-left:20px;"> + {{#each vendorIds}} + <li style="font-size:16px; margin-bottom:4px;">{{this}}</li> + {{/each}} + </ul> + + {{#if notes}} + <p style="font-size:16px; margin:16px 0 0 0;"><strong>메모:</strong></p> + <p style="font-size:16px; margin:8px 0 0 0;">{{notes}}</p> + {{/if}} +</div> + +<p style="text-align: center; margin: 25px 0;"> + <a href="{{portalUrl}}" target="_blank" style="display:inline-block; background-color:#163CC4; color:#ffffff; padding:10px 20px; text-decoration:none; border-radius:4px;">벤더 포털 바로가기</a> +</p> + +<p style="font-size:16px;">문의사항이 있으시면 시스템 관리자에게 연락해 주세요.</p> + +<p style="font-size:16px;">감사합니다.<br />eVCP 팀</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/otp.hbs b/lib/mail/templates/otp.hbs index adeda416..48df33f9 100644 --- a/lib/mail/templates/otp.hbs +++ b/lib/mail/templates/otp.hbs @@ -1,77 +1,27 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0"/> - <title>{{subject}}</title> - <style> - body { - font-family: Arial, sans-serif; - background: #f9fafb; - color: #111827; - padding: 20px; - } - .container { - max-width: 480px; - margin: 0 auto; - background: #ffffff; - border: 1px solid #e5e7eb; - border-radius: 6px; - padding: 24px; - } - h1 { - font-size: 20px; - margin-bottom: 8px; - color: #111827; - } - p { - line-height: 1.5; - margin-bottom: 16px; - } - .code { - display: inline-block; - font-size: 24px; - font-weight: bold; - letter-spacing: 2px; - margin: 12px 0; - background: #f3f4f6; - padding: 8px 16px; - border-radius: 4px; - } - a { - color: #3b82f6; - text-decoration: none; - } - .footer { - font-size: 12px; - color: #6b7280; - margin-top: 24px; - } - </style> - </head> - <body> - <div class="container"> - <h1>{{t "verifyYourEmailTitle"}}</h1> - <p>{{t "greeting"}}, {{name}}</p> +{{> header logoUrl=logoUrl }} - <p> - {{t "receivedSignInAttempt" location=location}} - </p> +<h1 style="font-size:28px; margin-bottom:20px; color:#111827;">{{t "verifyYourEmailTitle"}}</h1> - <p> - {{t "enterCodeInstruction"}} - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;">{{t "greeting"}}, {{name}}</p> - <p class="code">{{otp}}</p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "receivedSignInAttempt" location=location}} +</p> - <p> - <a href="{{verificationUrl}}">{{verificationUrl}}</a> - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "enterCodeInstruction"}} +</p> +<p style="font-size:24px; font-weight:bold; letter-spacing:2px; background-color:#f3f4f6; padding:8px 16px; border-radius:4px; display:inline-block; margin:12px 0;"> + {{otp}} +</p> - <div class="footer"> - {{t "securityWarning"}} - </div> - </div> - </body> -</html>
\ No newline at end of file +<p style="font-size:16px; line-height:24px; margin-bottom:16px;"> + <a href="{{verificationUrl}}" style="color:#0284C7; text-decoration:none;">{{verificationUrl}}</a> +</p> + +<p style="font-size:16px; color:#6b7280; margin-top:16px;"> + {{t "securityWarning"}} +</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/pq-submitted-admin.hbs b/lib/mail/templates/pq-submitted-admin.hbs new file mode 100644 index 00000000..0db3d6e4 --- /dev/null +++ b/lib/mail/templates/pq-submitted-admin.hbs @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>PQ Submission Notification</title> + <style> + body { + font-family: Arial, sans-serif; + line-height: 1.6; + color: #333; + padding: 20px; + max-width: 600px; + margin: 0 auto; + } + .header { + background-color: #0070f3; + color: white; + padding: 15px; + text-align: center; + margin-bottom: 20px; + border-radius: 5px; + } + .content { + background-color: #f9f9f9; + padding: 20px; + border-radius: 5px; + margin-bottom: 20px; + } + .details { + margin: 15px 0; + } + .details p { + margin: 5px 0; + } + .button { + display: inline-block; + background-color: #0070f3; + color: white; + text-decoration: none; + padding: 10px 20px; + border-radius: 5px; + margin: 20px 0; + text-align: center; + } + .footer { + text-align: center; + font-size: 12px; + color: #777; + margin-top: 30px; + } + </style> +</head> +<body> + <div class="header"> + <h1>PQ Submission Notification</h1> + </div> + + <div class="content"> + <h2>New PQ Submission Received</h2> + + <p>A new {{#if isProjectPQ}}project-specific{{else}}general{{/if}} PQ has been submitted and is ready for your review.</p> + + <div class="details"> + <p><strong>Vendor Name:</strong> {{vendorName}}</p> + <p><strong>Vendor ID:</strong> {{vendorId}}</p> + {{#if isProjectPQ}} + <p><strong>Project Name:</strong> {{projectName}}</p> + <p><strong>Project ID:</strong> {{projectId}}</p> + {{/if}} + <p><strong>Submission Date:</strong> {{submittedDate}}</p> + </div> + + <p>Please review this submission at your earliest convenience.</p> + + <a href="{{adminUrl}}" class="button">Review PQ Submission</a> + </div> + + <div class="footer"> + <p>This is an automated notification from the eVCP system. Please do not reply to this email.</p> + <p>© {{currentYear}} eVCP - Vendor Compliance Portal</p> + </div> +</body> +</html>
\ No newline at end of file diff --git a/lib/mail/templates/pq-submitted-vendor.hbs b/lib/mail/templates/pq-submitted-vendor.hbs new file mode 100644 index 00000000..9cf8e133 --- /dev/null +++ b/lib/mail/templates/pq-submitted-vendor.hbs @@ -0,0 +1,93 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>PQ Submission Confirmation</title> + <style> + body { + font-family: Arial, sans-serif; + line-height: 1.6; + color: #333; + padding: 20px; + max-width: 600px; + margin: 0 auto; + } + .header { + background-color: #0070f3; + color: white; + padding: 15px; + text-align: center; + margin-bottom: 20px; + border-radius: 5px; + } + .content { + background-color: #f9f9f9; + padding: 20px; + border-radius: 5px; + margin-bottom: 20px; + } + .details { + margin: 15px 0; + } + .details p { + margin: 5px 0; + } + .button { + display: inline-block; + background-color: #0070f3; + color: white; + text-decoration: none; + padding: 10px 20px; + border-radius: 5px; + margin: 20px 0; + text-align: center; + } + .footer { + text-align: center; + font-size: 12px; + color: #777; + margin-top: 30px; + } + .success-message { + padding: 15px; + background-color: #dff0d8; + border-left: 4px solid #5cb85c; + margin-bottom: 20px; + } + </style> +</head> +<body> + <div class="header"> + <h1>PQ Submission Confirmation</h1> + </div> + + <div class="content"> + <div class="success-message"> + <p>Thank you! Your {{#if isProjectPQ}}project-specific{{else}}general{{/if}} PQ has been successfully submitted.</p> + </div> + + <h2>Submission Details</h2> + + <div class="details"> + <p><strong>Vendor Name:</strong> {{vendorName}}</p> + {{#if isProjectPQ}} + <p><strong>Project Name:</strong> {{projectName}}</p> + {{/if}} + <p><strong>Submission Date:</strong> {{submittedDate}}</p> + </div> + + <p>Our team will review your submission and contact you if any additional information is needed.</p> + + <p>You can access your dashboard to track the status of your submissions and manage your vendor profile.</p> + + <a href="{{portalUrl}}" class="button">Go to Vendor Dashboard</a> + </div> + + <div class="footer"> + <p>This is an automated confirmation from the eVCP system. Please do not reply to this email.</p> + <p>If you have any questions, please contact your procurement representative.</p> + <p>© {{currentYear}} eVCP - Vendor Compliance Portal</p> + </div> +</body> +</html>
\ No newline at end of file diff --git a/lib/mail/templates/pq.hbs b/lib/mail/templates/pq.hbs new file mode 100644 index 00000000..78fb6fcd --- /dev/null +++ b/lib/mail/templates/pq.hbs @@ -0,0 +1,86 @@ +<!DOCTYPE html> +<html lang="{{language}}"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>PQ Invitation</title> + <style> + body { + font-family: Arial, sans-serif; + line-height: 1.6; + color: #333; + max-width: 600px; + margin: 0 auto; + padding: 20px; + } + .header { + background-color: #0066cc; + color: white; + padding: 20px; + text-align: center; + border-radius: 5px 5px 0 0; + } + .content { + background-color: #f9f9f9; + padding: 20px; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + } + .footer { + background-color: #f1f1f1; + padding: 15px; + text-align: center; + font-size: 14px; + border-radius: 0 0 5px 5px; + border: 1px solid #ddd; + } + .button { + display: inline-block; + background-color: #0066cc; + color: white; + padding: 12px 25px; + text-decoration: none; + border-radius: 5px; + margin: 20px 0; + font-weight: bold; + } + </style> +</head> +<body> + <div class="header"> + <h1>eVCP Pre-Qualification Invitation</h1> + </div> + + <div class="content"> + <p>Dear {{vendorName}},</p> + + <p>You have been invited to submit your Pre-Qualification (PQ) information for our vendor database. Completing this process will allow us to consider your company for future projects and procurement opportunities.</p> + + <p>To submit your PQ information:</p> + <ol> + <li>Click on the button below to access our vendor portal</li> + <li>Log in to your account (or register if you haven't already)</li> + <li>Navigate to the PQ section in your dashboard</li> + <li>Complete all required information about your company, capabilities, and experience</li> + </ol> + + <center> + <a href="{{loginUrl}}" class="button">Access Vendor Portal</a> + </center> + + <p>Maintaining up-to-date PQ information in our system is essential for your company to be considered for upcoming opportunities.</p> + + <p>If you have any questions or need assistance, please contact our vendor management team.</p> + + <p>We look forward to learning more about your company and potentially working together on future projects.</p> + + <p>Best regards,<br> + The eVCP Team</p> + </div> + + <div class="footer"> + <p>This is an automated email. Please do not reply to this message.</p> + <p>© eVCP Vendor Management System</p> + </div> +</body> +</html>
\ No newline at end of file diff --git a/lib/mail/templates/project-pq.hbs b/lib/mail/templates/project-pq.hbs new file mode 100644 index 00000000..2ecbd3a2 --- /dev/null +++ b/lib/mail/templates/project-pq.hbs @@ -0,0 +1,99 @@ +<!DOCTYPE html> +<html lang="{{language}}"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Project PQ Invitation</title> + <style> + body { + font-family: Arial, sans-serif; + line-height: 1.6; + color: #333; + max-width: 600px; + margin: 0 auto; + padding: 20px; + } + .header { + background-color: #0066cc; + color: white; + padding: 20px; + text-align: center; + border-radius: 5px 5px 0 0; + } + .content { + background-color: #f9f9f9; + padding: 20px; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + } + .footer { + background-color: #f1f1f1; + padding: 15px; + text-align: center; + font-size: 14px; + border-radius: 0 0 5px 5px; + border: 1px solid #ddd; + } + .button { + display: inline-block; + background-color: #0066cc; + color: white; + padding: 12px 25px; + text-decoration: none; + border-radius: 5px; + margin: 20px 0; + font-weight: bold; + } + .project-info { + background-color: #e6f2ff; + padding: 15px; + border-radius: 5px; + margin: 15px 0; + } + </style> +</head> +<body> + <div class="header"> + <h1>eVCP Project PQ Invitation</h1> + </div> + + <div class="content"> + <p>Dear {{vendorName}},</p> + + <p>You have been selected to participate in the Pre-Qualification (PQ) process for the following project:</p> + + <div class="project-info"> + <p><strong>Project Code:</strong> {{projectCode}}</p> + <p><strong>Project Name:</strong> {{projectName}}</p> + </div> + + <p>This is an important step in our vendor selection process. Please complete the Project PQ questionnaire at your earliest convenience.</p> + + <p>To submit your Project PQ:</p> + <ol> + <li>Click on the button below to access our vendor portal</li> + <li>Log in to your account (or register if you haven't already)</li> + <li>Navigate to the PQ section where you'll find the Project PQ for {{projectCode}}</li> + <li>Complete all required information</li> + </ol> + + <center> + <a href="{{loginUrl}}" class="button">Access Vendor Portal</a> + </center> + + <p>Please note that completing this Project PQ is a prerequisite for being considered for this project.</p> + + <p>If you have any questions or need assistance, please contact our vendor management team.</p> + + <p>Thank you for your participation.</p> + + <p>Best regards,<br> + The eVCP Team</p> + </div> + + <div class="footer"> + <p>This is an automated email. Please do not reply to this message.</p> + <p>© eVCP Vendor Management System</p> + </div> +</body> +</html>
\ No newline at end of file diff --git a/lib/mail/templates/rfq-invite.hbs b/lib/mail/templates/rfq-invite.hbs index 25bd96eb..8ec20a99 100644 --- a/lib/mail/templates/rfq-invite.hbs +++ b/lib/mail/templates/rfq-invite.hbs @@ -1,116 +1,43 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8" /> - <title>{{t "rfqInvite.title" lng=language}} #{{rfqCode}}</title> - <style> - /* 간단한 스타일 예시 */ - body { - font-family: Arial, sans-serif; - margin: 0; - padding: 16px; - background-color: #f5f5f5; - } - .container { - max-width: 600px; - margin: 0 auto; - background-color: #ffffff; - padding: 24px; - border-radius: 8px; - } - h1 { - font-size: 20px; - margin-bottom: 16px; - } - p { - font-size: 14px; - line-height: 1.6; - } - ul { - margin-left: 20px; - } - li { - font-size: 14px; - line-height: 1.6; - } - .btn { - display: inline-block; - margin-top: 16px; - padding: 12px 24px; - background-color: #1D4ED8; - color: #ffffff !important; - text-decoration: none; - border-radius: 4px; - } - .footer { - margin-top: 24px; - font-size: 12px; - color: #888888; - } - </style> - </head> - <body> - <div class="container"> - <!-- 상단 로고/타이틀 영역 --> - <div style="text-align: center;"> - <!-- 필요 시 로고 이미지 --> - <!-- <img src="https://your-logo-url.com/logo.png" alt="EVCP" width="120" /> --> - </div> +{{> header logoUrl=logoUrl }} - <!-- 메인 타이틀: RFQ 초대 --> - <h1> - {{t "rfqInvite.heading" lng=language}} - #{{rfqCode}} - </h1> +<h1 style="font-size:28px; line-height:40px; margin-bottom:16px;"> + {{t "rfqInvite.heading" lng=language}} #{{rfqCode}} +</h1> - <!-- 벤더에게 인사말 --> - <p> - {{t "rfqInvite.greeting" lng=language}}, <strong>Vendor #{{vendorId}}</strong>. - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "rfqInvite.greeting" lng=language}}, <strong>Vendor #{{vendorId}}</strong>. +</p> - <!-- 프로젝트/RFQ 정보 --> - <p> - {{t "rfqInvite.bodyIntro" lng=language}} - <br /> - <strong>{{t "rfqInvite.projectName" lng=language}}:</strong> {{projectName}}<br /> - <strong>{{t "rfqInvite.projectCode" lng=language}}:</strong> {{projectCode}}<br /> - <strong>{{t "rfqInvite.dueDate" lng=language}}:</strong> {{dueDate}}<br /> - <strong>{{t "rfqInvite.description" lng=language}}:</strong> {{description}} - </p> +<p style="font-size:16px; line-height:32px; margin-bottom:16px;"> + {{t "rfqInvite.bodyIntro" lng=language}}<br/> + <strong>{{t "rfqInvite.projectName" lng=language}}:</strong> {{projectName}}<br /> + <strong>{{t "rfqInvite.projectCode" lng=language}}:</strong> {{projectCode}}<br /> + <strong>{{t "rfqInvite.dueDate" lng=language}}:</strong> {{dueDate}}<br /> + <strong>{{t "rfqInvite.description" lng=language}}:</strong> {{description}} +</p> - <!-- 아이템 목록 --> - <p> - {{t "rfqInvite.itemListTitle" lng=language}} - </p> - <ul> - {{#each items}} - <li> - <strong>{{this.itemCode}}</strong> - ({{this.quantity}} {{this.uom}}) - - {{this.description}} - </li> - {{/each}} - </ul> +<p style="font-size:16px; line-height:32px; margin-bottom:8px;"> + {{t "rfqInvite.itemListTitle" lng=language}} +</p> - <!-- 로그인/접속 안내 --> - <p> - {{t "rfqInvite.moreDetail" lng=language}} - </p> - <a class="btn" href="{{loginUrl}}" target="_blank"> - {{t "rfqInvite.viewButton" lng=language}} - </a> +<ul style="margin-left:4px; font-size:16px; line-height:32px;"> + {{#each items}} + <li><strong>{{this.itemCode}}</strong> ({{this.quantity}} {{this.uom}}) - {{this.description}}</li> + {{/each}} +</ul> - <!-- 기타 안내 문구 --> - <p> - {{t "rfqInvite.supportMsg" lng=language}} - </p> +<p style="font-size:14px; line-height:32px; margin-top:16px;"> + {{t "rfqInvite.moreDetail" lng=language}} +</p> - <!-- 푸터 --> - <div class="footer"> - <p> - {{t "rfqInvite.footerDisclaimer" lng=language}} - </p> - </div> - </div> - </body> -</html>
\ No newline at end of file +<p> + <a href="{{loginUrl}}" target="_blank" style="display: inline-block; width: 250px; padding: 12px 20px; background-color: #163CC4; color: #ffffff !important; text-decoration: none; border-radius: 8px; text-align: center; line-height: 28px;"> + {{t "rfqInvite.viewButton" lng=language}} + </a> +</p> + +<p style="font-size:16px; line-height:24px; margin-top:16px;"> + {{t "rfqInvite.supportMsg" lng=language}} +</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-active.hbs b/lib/mail/templates/vendor-active.hbs index 6458e2fb..a2643f94 100644 --- a/lib/mail/templates/vendor-active.hbs +++ b/lib/mail/templates/vendor-active.hbs @@ -1,51 +1,25 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <title>벤더 등록이 완료되었습니다</title> - <style> - body { font-family: 'Malgun Gothic', sans-serif; line-height: 1.6; } - .container { max-width: 600px; margin: 0 auto; padding: 20px; } - .header { background-color: #f5f5f5; padding: 10px; text-align: center; } - .content { padding: 20px 0; } - .vendor-code { font-size: 18px; font-weight: bold; background-color: #f0f0f0; - padding: 10px; margin: 15px 0; text-align: center; } - .button { display: inline-block; background-color: #28a745; color: white; - padding: 10px 20px; text-decoration: none; border-radius: 4px; } - .footer { margin-top: 20px; font-size: 12px; color: #777; } - </style> -</head> -<body> - <div class="container"> - <div class="header"> - <h2>벤더 등록이 완료되었습니다</h2> - </div> - - <div class="content"> - <p>{{vendorName}} 귀하,</p> - - <p>축하합니다! 귀사의 벤더 등록이 완료되었으며 벤더 정보가 당사 시스템에 성공적으로 등록되었습니다.</p> - - <p>귀사의 벤더 코드는 다음과 같습니다:</p> - <div class="vendor-code">{{vendorCode}}</div> - - <p>향후 모든 의사소통 및 거래 시 이 벤더 코드를 사용해 주십시오. 이제 벤더 포털에 접속하여 계정 관리, 발주서 확인 및 인보이스 제출을 할 수 있습니다.</p> - - <p style="text-align: center; margin: 25px 0;"> - <a href="{{portalUrl}}" class="button">벤더 포털 접속</a> - </p> - - <p>벤더 계정에 관한 질문이나 도움이 필요하시면 당사 벤더 관리팀에 문의해 주십시오.</p> - - <p>파트너십에 감사드립니다.</p> - - <p>감사합니다.<br> - eVCP 팀</p> - </div> - - <div class="footer"> - <p>이 메시지는 자동으로 발송되었습니다. 이 이메일에 회신하지 마십시오.</p> - </div> - </div> -</body> -</html>
\ No newline at end of file +{{> header logoUrl=logoUrl }} + +<h2 style="font-size:28px; margin-bottom:16px;">협력업체 등록이 완료되었습니다</h2> + +<p style="font-size:16px;">{{vendorName}} 귀하,</p> + +<p style="font-size:16px;">축하합니다! 귀사의 협력업체 등록이 완료되었으며 협력업체 정보가 당사 시스템에 성공적으로 등록되었습니다.</p> + +<p style="font-size:16px;">귀사의 협력업체 코드는 다음과 같습니다:</p> + +<div style="font-size:24px; font-weight:bold; letter-spacing:2px; background-color:#F1F5F9; padding:8px 16px; border-radius:4px; display:inline-block; margin:12px 0;"> + {{vendorCode}} +</div> + +<p style="font-size:1px;">이 코드를 사용하여 포털에 접속하고 계정을 관리할 수 있습니다.</p> + +<p style="text-align: center; margin: 25px 0;"> + <a href="{{portalUrl}}" target="_blank" style="display:inline-block; background-color:#163CC4; color:#ffffff; padding:10px 20px; text-decoration:none; border-radius:4px;">협력업체 포털 접속</a> +</p> + +<p style="font-size:16px;">문의사항이 있으시면 협력업체 관리팀에 연락해 주세요.</p> + +<p style="font-size:16px;">감사합니다.<br />eVCP 팀</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-additional-info.hbs b/lib/mail/templates/vendor-additional-info.hbs index 9d93bb7b..17d9b130 100644 --- a/lib/mail/templates/vendor-additional-info.hbs +++ b/lib/mail/templates/vendor-additional-info.hbs @@ -1,76 +1,19 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>{{t "email.additionalInfo.title"}}</title> - <style> - body { - font-family: Arial, sans-serif; - line-height: 1.6; - color: #333; - max-width: 600px; - margin: 0 auto; - padding: 20px; - } - .header { - background-color: #0056b3; - color: white; - padding: 20px; - text-align: center; - border-radius: 5px 5px 0 0; - } - .content { - padding: 20px; - border: 1px solid #ddd; - border-top: none; - border-radius: 0 0 5px 5px; - } - .button { - background-color: #0056b3; - color: white; - padding: 12px 20px; - text-decoration: none; - border-radius: 5px; - display: inline-block; - margin-top: 15px; - font-weight: bold; - } - .footer { - margin-top: 30px; - text-align: center; - font-size: 0.8em; - color: #777; - } - </style> -</head> -<body> - <div class="header"> - <h1>{{t "email.additionalInfo.header"}}</h1> - </div> +{{#> layout title=(t "email.additionalInfo.title")}} + <p>{{t "email.additionalInfo.greeting" vendorName=vendorName}}</p> - <div class="content"> - <p>{{t "email.additionalInfo.greeting" vendorName=vendorName}}</p> - - <p>{{t "email.additionalInfo.messageP1"}}</p> - - <p>{{t "email.additionalInfo.messageP2"}}</p> - - <p>{{t "email.additionalInfo.messageP3"}}</p> - - <div style="text-align: center;"> - <a href="{{vendorInfoUrl}}" class="button">{{t "email.additionalInfo.buttonText"}}</a> - </div> - - <p>{{t "email.additionalInfo.messageP4"}}</p> - - <p>{{t "email.additionalInfo.closing"}}</p> - - <p>EVCP Team</p> - </div> + <p>{{t "email.additionalInfo.messageP1"}}</p> + + <p>{{t "email.additionalInfo.messageP2"}}</p> + + <p>{{t "email.additionalInfo.messageP3"}}</p> - <div class="footer"> - <p>© {{currentYear}} EVCP. {{t "email.additionalInfo.footerText"}}</p> + <div class="button-container"> + <a href="{{vendorInfoUrl}}" class="button">{{t "email.additionalInfo.buttonText"}}</a> </div> -</body> -</html>
\ No newline at end of file + + <p>{{t "email.additionalInfo.messageP4"}}</p> + + <p>{{t "email.additionalInfo.closing"}}</p> + + <p>EVCP Team</p> +{{/layout}}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-invitation.hbs b/lib/mail/templates/vendor-invitation.hbs index d85067f4..9b68c10c 100644 --- a/lib/mail/templates/vendor-invitation.hbs +++ b/lib/mail/templates/vendor-invitation.hbs @@ -1,86 +1,20 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Vendor Registration Invitation</title> - <style> - body { - font-family: Arial, sans-serif; - line-height: 1.6; - color: #333333; - margin: 0; - padding: 0; - } - .container { - max-width: 600px; - margin: 0 auto; - padding: 20px; - } - .header { - background-color: #2563EB; - padding: 20px; - text-align: center; - color: white; - } - .content { - padding: 20px; - background-color: #ffffff; - } - .footer { - padding: 20px; - text-align: center; - font-size: 12px; - color: #666666; - background-color: #f5f5f5; - } - .button { - display: inline-block; - background-color: #2563EB; - color: white; - padding: 12px 24px; - text-decoration: none; - border-radius: 4px; - margin: 20px 0; - font-weight: bold; - } - .highlight { - background-color: #f8f9fa; - padding: 15px; - border-left: 4px solid #2563EB; - margin: 20px 0; - } - </style> -</head> -<body> - <div class="container"> - <div class="header"> - <h1>{{t "email.vendor.invitation.title"}}</h1> - </div> - <div class="content"> - <p>{{t "email.vendor.invitation.greeting"}} {{companyName}},</p> - - <p>{{t "email.vendor.invitation.message"}}</p> - - <div class="highlight"> - <p>{{t "email.vendor.invitation.details"}}</p> - </div> - - <div style="text-align: center;"> - <a href="{{registrationLink}}" class="button">{{t "email.vendor.invitation.register_now"}}</a> - </div> - - <p>{{t "email.vendor.invitation.expire_notice"}}</p> - - <p>{{t "email.vendor.invitation.footer"}}</p> - - <p>{{t "email.vendor.invitation.signature"}}<br> - EVCP {{t "email.vendor.invitation.team"}}</p> - </div> - <div class="footer"> - <p>© {{currentYear}} EVCP. {{t "email.vendor.invitation.copyright"}}</p> - <p>{{t "email.vendor.invitation.no_reply"}}</p> - </div> +{{#> layout title=(t "email.vendor.invitation.title")}} + <p>{{t "email.vendor.invitation.greeting"}} {{companyName}},</p> + + <p>{{t "email.vendor.invitation.message"}}</p> + + <div class="info-box"> + <p>{{t "email.vendor.invitation.details"}}</p> </div> -</body> -</html>
\ No newline at end of file + + <div class="button-container"> + <a href="{{registrationLink}}" class="button">{{t "email.vendor.invitation.register_now"}}</a> + </div> + + <p>{{t "email.vendor.invitation.expire_notice"}}</p> + + <p>{{t "email.vendor.invitation.footer"}}</p> + + <p>{{t "email.vendor.invitation.signature"}}<br> + EVCP {{t "email.vendor.invitation.team"}}</p> +{{/layout}}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-pq-comment.hbs b/lib/mail/templates/vendor-pq-comment.hbs index b60deedc..3606bcdb 100644 --- a/lib/mail/templates/vendor-pq-comment.hbs +++ b/lib/mail/templates/vendor-pq-comment.hbs @@ -1,128 +1,41 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>PQ Review Comments</title> - <style> - body { - font-family: Arial, sans-serif; - line-height: 1.6; - color: #333; - margin: 0; - padding: 0; - } - .container { - max-width: 600px; - margin: 0 auto; - padding: 20px; - } - .header { - text-align: center; - padding: 20px 0; - border-bottom: 1px solid #eee; - } - .content { - padding: 20px 0; - } - .footer { - text-align: center; - padding: 20px 0; - font-size: 12px; - color: #999; - border-top: 1px solid #eee; - } - .btn { - display: inline-block; - padding: 10px 20px; - font-size: 16px; - color: #fff; - background-color: #0071bc; - text-decoration: none; - border-radius: 4px; - margin: 20px 0; - } - .comment-section { - margin: 20px 0; - padding: 15px; - background-color: #f9f9f9; - border-left: 4px solid #0071bc; - } - .comment-item { - margin-bottom: 15px; - padding-bottom: 15px; - border-bottom: 1px solid #eee; - } - .comment-item:last-child { - border-bottom: none; - } - .comment-code { - font-weight: bold; - color: #0071bc; - display: inline-block; - min-width: 60px; - } - .comment-title { - font-weight: bold; - color: #333; - } - .important { - color: #d14; - font-weight: bold; - } - </style> -</head> -<body> - <div class="container"> - <div class="header"> - <h1>PQ Review Comments</h1> - </div> - - <div class="content"> - <p>Dear {{name}} ({{vendorCode}}),</p> - - <p>Thank you for submitting your PQ information. Our review team has completed the initial review and has requested some changes or additional information.</p> - - <p><span class="important">Action Required:</span> Please log in to your account and update your PQ submission based on the comments below.</p> - - {{#if hasGeneralComment}} - <div class="comment-section"> - <h3>General Comments:</h3> - <p>{{generalComment}}</p> - </div> - {{/if}} - - <div class="comment-section"> - <h3>Specific Item Comments ({{commentCount}}):</h3> - {{#each comments}} - <div class="comment-item"> - <div> - <span class="comment-code">{{code}}</span> - <span class="comment-title">{{checkPoint}}</span> - </div> - <p>{{text}}</p> - </div> - {{/each}} - </div> - - <p>Please review these comments and make the necessary updates to your PQ submission. Once you have made the requested changes, you can resubmit your PQ for further review.</p> - - <div style="text-align: center;"> - <a href="{{loginUrl}}" class="btn">Log in to update your PQ</a> - </div> - - <p>If you have any questions or need assistance, please contact our support team.</p> - - <p>Thank you for your cooperation.</p> - - <p>Best regards,<br> - PQ Review Team</p> - </div> - - <div class="footer"> - <p>This is an automated email. Please do not reply to this message.</p> - <p>© {{currentYear}} Your Company Name. All rights reserved.</p> +{{> header logoUrl=logoUrl }} + +<h1 style="text-align:center; font-size:28px; margin-bottom:20px;">PQ Review Comments</h1> + +<p style="font-size:16px;">Dear {{name}} ({{vendorCode}}),</p> + +<p style="font-size:16px;">Thank you for submitting your PQ information. Our review team has completed the initial review and has requested some changes or additional information.</p> + +<p style="font-size:16px;"><span style="color:#d14; font-weight:bold;">Action Required:</span> Please log in to your account and update your PQ submission based on the comments below.</p> + +{{#if hasGeneralComment}} +<div style="margin:20px 0; padding:15px; background-color:#f9f9f9; border-left:4px solid #0071bc;"> + <h3>General Comments:</h3> + <p>{{generalComment}}</p> +</div> +{{/if}} + +<div style="margin:20px 0; padding:15px; background-color:#f9f9f9; border-left:4px solid #0071bc;"> + <h3>Specific Item Comments ({{commentCount}}):</h3> + {{#each comments}} + <div style="margin-bottom:15px; border-bottom:1px solid #eee; padding-bottom:15px;"> + <div> + <span style="font-weight:bold; color:#0071bc; display:inline-block; min-width:60px;">{{code}}</span> + <span style="font-weight:bold; color:#333;">{{checkPoint}}</span> </div> + <p>{{text}}</p> </div> -</body> -</html>
\ No newline at end of file + {{/each}} +</div> + +<p style="font-size:16px;">Please review these comments and update your PQ submission.</p> + +<div style="text-align:center; margin:20px 0;"> + <a href="{{loginUrl}}" class="btn" style="padding:10px 20px; font-size:16px; background-color:#0071bc; color:#fff; text-decoration:none; border-radius:4px;">Log in to update your PQ</a> +</div> + +<p style="font-size:16px;">If you have any questions, please contact our support team.</p> + +<p style="font-size:16px;">Thank you,<br />PQ Review Team</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=currentYear }}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-pq-status.hbs b/lib/mail/templates/vendor-pq-status.hbs index 541a6137..4a3fece5 100644 --- a/lib/mail/templates/vendor-pq-status.hbs +++ b/lib/mail/templates/vendor-pq-status.hbs @@ -1,48 +1,23 @@ -<!-- file: templates/vendor-pq-status.hbs --> +{{> header logoUrl=logoUrl }} -<html> - <body style="font-family: sans-serif; margin: 0; padding: 0;"> - <table width="100%" cellspacing="0" cellpadding="20" style="background-color: #f7f7f7;"> - <tr> - <td> - <table width="600" cellspacing="0" cellpadding="20" style="background-color: #ffffff; margin: 0 auto;"> - <tr> - <td style="text-align: center;"> - <h1 style="margin-bottom: 0.5rem;">Vendor PQ Status Update</h1> - </td> - </tr> - <tr> - <td> - <p>Hello {{name}},</p> - <p> - Your vendor status has been updated to - <strong>{{status}}</strong>. - </p> - <p> - You can log in to see details and take further action: - <br /> - <a href="{{loginUrl}}" style="color: #007bff; text-decoration: underline;"> - Go to Portal - </a> - </p> - <p> - If you have any questions, feel free to contact us. - </p> - <p>Thank you,<br/> - The PQ Team - </p> - </td> - </tr> - <tr> - <td style="text-align: center; border-top: 1px solid #eee;"> - <small style="color: #999;"> - © 2023 MyCompany - </small> - </td> - </tr> - </table> - </td> - </tr> - </table> - </body> -</html>
\ No newline at end of file +<h1 style="text-align:center; font-size:28px; margin-bottom:20px;">Vendor PQ Status Update</h1> + +<p style="font-size:16px;">Hello {{name}},</p> + +<p style="font-size:16px;"> + Your vendor status has been updated to <strong>{{status}}</strong>. +</p> + +<p style="font-size:16px;"> + You can log in to see details and take further action: + <br /> + <a href="{{loginUrl}}" target="_blank" style="color:#163CC4; text-decoration:underline;"> + Go to Portal + </a> +</p> + +<p style="font-size:16px;">If you have any questions, feel free to contact us.</p> + +<p style="font-size:16px;">Thank you,<br/>The PQ Team</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file diff --git a/lib/mail/templates/vendor-project-pq-status.hbs b/lib/mail/templates/vendor-project-pq-status.hbs new file mode 100644 index 00000000..c051ce02 --- /dev/null +++ b/lib/mail/templates/vendor-project-pq-status.hbs @@ -0,0 +1,42 @@ +{{> header logoUrl=logoUrl }} + +<h1 style="text-align:center; font-size:28px; margin-bottom:20px;">Vendor Project PQ Status Update</h1> + +<p style="font-size:16px;">Hello {{name}},</p> + +<p style="font-size:16px;"> + Your vendor status for <strong>{{projectName}}</strong> has been updated to <strong>{{status}}</strong>. +</p> + +{{#if hasRejectionReason}} +<p style="font-size:16px; padding:15px; background-color:#f8f8f8; border-left:4px solid #e74c3c;"> + <strong>Reason for rejection:</strong><br/> + {{rejectionReason}} +</p> +{{/if}} + +{{#if approvalDate}} +<p style="font-size:16px;"> + <strong>Approval Date:</strong> {{approvalDate}} +</p> +{{/if}} + +{{#if rejectionDate}} +<p style="font-size:16px;"> + <strong>Rejection Date:</strong> {{rejectionDate}} +</p> +{{/if}} + +<p style="font-size:16px;"> + You can log in to see details and take further action: + <br /> + <a href="{{loginUrl}}" target="_blank" style="color:#163CC4; text-decoration:underline;"> + Go to Portal + </a> +</p> + +<p style="font-size:16px;">If you have any questions, feel free to contact us.</p> + +<p style="font-size:16px;">Thank you,<br/>The PQ Team</p> + +{{> footer logoUrl=logoUrl companyName=companyName year=year }}
\ No newline at end of file |
