From 5a886aa9fb9fe4e2203f3cb1d62c91f4be0525ed Mon Sep 17 00:00:00 2001 From: Miguel Serrano Date: Thu, 14 May 2026 11:37:47 +0200 Subject: [PATCH] [web] Add extra details to flexible license sales email (#32929) * [web] Add extra details to flexible license sales email GitOrigin-RevId: fbd41adae21c55c5e97f9531565100e1ae911808 --- .../SubscriptionGroupController.mjs | 13 +++++++- .../SubscriptionGroupController.test.mjs | 32 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs b/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs index 446332d79c..a871c766c1 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs +++ b/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs @@ -2,6 +2,7 @@ import SubscriptionGroupHandler from './SubscriptionGroupHandler.mjs' import OError from '@overleaf/o-error' import logger from '@overleaf/logger' +import Settings from '@overleaf/settings' import SubscriptionLocator from './SubscriptionLocator.mjs' import SessionManager from '../Authentication/SessionManager.mjs' import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs' @@ -312,7 +313,7 @@ async function submitForm(req, res) { const userId = SessionManager.getLoggedInUserId(req.session) const userEmail = await UserGetter.promises.getUserEmail(userId) - const { paymentProviderSubscription } = + const { paymentProviderSubscription, subscription } = await SubscriptionGroupHandler.promises.getUsersGroupSubscriptionDetails( userId ) @@ -327,9 +328,19 @@ async function submitForm(req, res) { const messageLines = [`\n**Overleaf Sales Contact Form:**`] messageLines.push('**Subject:** Self-Serve Group User Increase Request') messageLines.push(`**Estimated Number of Users:** ${adding}`) + messageLines.push( + `**Subscription:** [${subscription._id}](${Settings.adminUrl}/admin/subscription/${subscription._id})` + ) + messageLines.push(`**Current Number of Seats:** ${subscription.membersLimit}`) + messageLines.push(`**Plan Code:** ${subscription.planCode}`) if (poNumber) { messageLines.push(`**PO Number:** ${poNumber}`) } + if (subscription.salesforce_id) { + messageLines.push( + `**Salesforce ID:** [${subscription.salesforce_id}](https://digitalscience.lightning.force.com/lightning/r/Opportunity/${subscription.salesforce_id}/view)` + ) + } messageLines.push( `**Message:** This email has been generated on behalf of user with email **${userEmail}** ` + 'to request an increase in the total number of users for their subscription.' diff --git a/services/web/test/unit/src/Subscription/SubscriptionGroupController.test.mjs b/services/web/test/unit/src/Subscription/SubscriptionGroupController.test.mjs index 26d2a12e98..b2f6ae0c63 100644 --- a/services/web/test/unit/src/Subscription/SubscriptionGroupController.test.mjs +++ b/services/web/test/unit/src/Subscription/SubscriptionGroupController.test.mjs @@ -28,6 +28,7 @@ describe('SubscriptionGroupController', function () { teamName: 'Cool group', groupPlan: true, membersLimit: 5, + planCode: 'group_collaborator_10', } ctx.plan = { @@ -212,6 +213,10 @@ describe('SubscriptionGroupController', function () { () => ctx.SubscriptionModel ) + vi.doMock('@overleaf/settings', () => ({ + default: { adminUrl: 'https://admin.overleaf.com' }, + })) + vi.doMock('@overleaf/logger', () => ({ default: { err: sinon.stub(), @@ -786,6 +791,12 @@ describe('SubscriptionGroupController', function () { '\n' + `**Estimated Number of Users:** ${adding}\n` + '\n' + + `**Subscription:** [${ctx.subscriptionId}](https://admin.overleaf.com/admin/subscription/${ctx.subscriptionId})\n` + + '\n' + + `**Current Number of Seats:** ${ctx.subscription.membersLimit}\n` + + '\n' + + `**Plan Code:** ${ctx.subscription.planCode}\n` + + '\n' + `**PO Number:** ${poNumber}\n` + '\n' + `**Message:** This email has been generated on behalf of user with email **${ctx.user.email}** to request an increase in the total number of users for their subscription.`, @@ -800,6 +811,27 @@ describe('SubscriptionGroupController', function () { ctx.Controller.submitForm(ctx.req, res, resolve) }) }) + + it('should include the Salesforce ID line when the subscription has a salesforce_id', async function (ctx) { + await new Promise(resolve => { + const adding = 100 + const salesforceId = '0061x000ABCDEFG' + ctx.subscription.salesforce_id = salesforceId + ctx.req.body = { adding } + + const res = { + sendStatus: () => { + const { message } = + ctx.Modules.promises.hooks.fire.getCall(0).args[1] + message.should.include( + `**Salesforce ID:** [${salesforceId}](https://digitalscience.lightning.force.com/lightning/r/Opportunity/${salesforceId}/view)\n` + ) + resolve() + }, + } + ctx.Controller.submitForm(ctx.req, res, resolve) + }) + }) }) describe('subscriptionUpgradePage', function () {