diff --git a/lib/adminApi.js b/lib/adminApi.js index 0b316b0..b0ec1c8 100644 --- a/lib/adminApi.js +++ b/lib/adminApi.js @@ -108,6 +108,8 @@ router.put('/settings', requireAuth, (req, res) => { if (typeof body.logonScript === 'string') patch.logonScript = body.logonScript; if (typeof body.homeDrive === 'string') patch.homeDrive = body.homeDrive; if (typeof body.homeBasePath === 'string') patch.homeBasePath = body.homeBasePath; + if (typeof body.crmUrl === 'string') patch.crmUrl = body.crmUrl; + if (typeof body.quickLinksUrl === 'string') patch.quickLinksUrl = body.quickLinksUrl; if (Object.keys(patch).length === 0) { return res.status(400).json({ success: false, error: 'Нет данных для сохранения' }); } @@ -273,7 +275,11 @@ router.post('/requests/:id/approve', requireAuth, async (req, res) => { groupCNs }); try { - await mailer.sendApproved(record.email, { login: record.login, password: record.password, fio: record.fio, position: record.position }); + await mailer.sendApproved(record.email, { + login: record.login, password: record.password, fio: record.fio, position: record.position, + crmUrl: settings.crmUrl, quickLinksUrl: settings.quickLinksUrl, + netbios: config.domain.split('.')[0].toLowerCase() + }); requests.markProcessed(record.id, { phase: 'approved', emailSent: true }); } catch (mailErr) { requests.markProcessed(record.id, { phase: 'approved', emailSent: false }); @@ -322,7 +328,12 @@ router.post('/requests/:id/resend', requireAuth, async (req, res) => { await mailer.sendPasswordChangeDenied(record.email, { fio: record.fio, reason: record.reason }); } } else if (record.phase === 'approved') { - await mailer.sendApproved(record.email, { login: record.login, password: record.password, fio: record.fio, position: record.position }); + const s = adminSettings.getSettings(); + await mailer.sendApproved(record.email, { + login: record.login, password: record.password, fio: record.fio, position: record.position, + crmUrl: s.crmUrl, quickLinksUrl: s.quickLinksUrl, + netbios: config.domain.split('.')[0].toLowerCase() + }); } else { await mailer.sendDenied(record.email, { fio: record.fio, reason: record.reason }); } diff --git a/lib/adminSettings.js b/lib/adminSettings.js index a121a48..2d695fb 100644 --- a/lib/adminSettings.js +++ b/lib/adminSettings.js @@ -19,12 +19,15 @@ function getSettings() { apiKey: typeof parsed.apiKey === 'string' ? parsed.apiKey : '', logonScript: typeof parsed.logonScript === 'string' ? parsed.logonScript : 'PST.bat', homeDrive: typeof parsed.homeDrive === 'string' ? parsed.homeDrive : 'Z:', - homeBasePath: typeof parsed.homeBasePath === 'string' ? parsed.homeBasePath : '\\\\dc\\Teachers' + homeBasePath: typeof parsed.homeBasePath === 'string' ? parsed.homeBasePath : '\\\\dc\\Teachers', + crmUrl: typeof parsed.crmUrl === 'string' ? parsed.crmUrl : '', + quickLinksUrl: typeof parsed.quickLinksUrl === 'string' ? parsed.quickLinksUrl : '' }; } catch (err) { return { ouDn: '', defaultGroups: [], phoneRequired: false, authEnabled: true, apiKey: '', - logonScript: 'PST.bat', homeDrive: 'Z:', homeBasePath: '\\\\dc\\Teachers' + logonScript: 'PST.bat', homeDrive: 'Z:', homeBasePath: '\\\\dc\\Teachers', + crmUrl: '', quickLinksUrl: '' }; } } @@ -42,6 +45,8 @@ function updateSettings(patch) { if (patch && typeof patch.logonScript === 'string') next.logonScript = patch.logonScript; if (patch && typeof patch.homeDrive === 'string') next.homeDrive = patch.homeDrive; if (patch && typeof patch.homeBasePath === 'string') next.homeBasePath = patch.homeBasePath; + if (patch && typeof patch.crmUrl === 'string') next.crmUrl = patch.crmUrl; + if (patch && typeof patch.quickLinksUrl === 'string') next.quickLinksUrl = patch.quickLinksUrl; fs.mkdirSync(path.dirname(settingsPath), { recursive: true }); fs.writeFileSync(settingsPath, JSON.stringify(next, null, 2), 'utf8'); return next; diff --git a/lib/mailer.js b/lib/mailer.js index d83ecbc..a72f736 100644 --- a/lib/mailer.js +++ b/lib/mailer.js @@ -38,12 +38,15 @@ function sendVerificationCode(email, code) { }); } -function sendApproved(email, { login, password, fio, position }) { +function sendApproved(email, { login, password, fio, position, crmUrl, quickLinksUrl, netbios }) { const positionLine = position ? `\nДолжность: ${position}` : ''; + const netbiosName = (netbios || config.domain.split('.')[0]).toLowerCase(); + const crmLine = crmUrl ? `\n\nАдрес СРМ (задачник): ${crmUrl}` : ''; + const linksLine = quickLinksUrl ? `\nСервис быстрых ссылок: ${quickLinksUrl}` : ''; return sendMail({ to: email, subject: 'Регистрация одобрена', - text: `Здравствуйте, ${fio}!\n\nВаша заявка на регистрацию одобрена.\n\nВаши данные для входа:\nЛогин: ${login}\nПароль: ${password}${positionLine}` + text: `Здравствуйте, ${fio}!\n\nВаша заявка на регистрацию одобрена.\n\nВаши данные для входа:\nЛогин: ${login}\nПароль: ${password}${positionLine}\n\nИнструкция по входу в систему:\n• Чтобы зайти под своей учётной записью, на экране входа выберите «Другой пользователь».\n• Логин и пароль едины и для входа на ПК, и для задачника.\n• Если простой логин и пароль не принимаются, введите учётную запись полностью с указанием домена: ${netbiosName}\\${login}\n (пример: ${netbiosName}\\${login})${crmLine}${linksLine}` }); } diff --git a/public/admin.html b/public/admin.html index cae64a6..43050ac 100644 --- a/public/admin.html +++ b/public/admin.html @@ -95,6 +95,20 @@ +
+
+ Адрес СРМ (задачник) +
Отображается в письме об одобрении регистрации
+
+ +
+
+
+ Сервис быстрых ссылок +
Отображается в письме об одобрении регистрации
+
+ +
@@ -281,7 +295,7 @@