diff --git a/Doppler.ReportingApi/Infrastructure/CampaignRepository.cs b/Doppler.ReportingApi/Infrastructure/CampaignRepository.cs index c7bd8c8..a0bdd89 100644 --- a/Doppler.ReportingApi/Infrastructure/CampaignRepository.cs +++ b/Doppler.ReportingApi/Infrastructure/CampaignRepository.cs @@ -124,157 +124,38 @@ GROUP BY } } - public async Task> GetSentCampaignsMetrics(string userName, int pageNumber, int pageSize, DateTime? startDate = null, DateTime? endDate = null, string campaignName = null, string campaignType = null, string fromEmail = null, List labels = null) + public async Task> GetSentCampaignsMetrics( + string userName, + int pageNumber, + int pageSize, + DateTime? startDate = null, + DateTime? endDate = null, + string campaignName = null, + string campaignType = null, + string fromEmail = null, + List labels = null) { - var labelsCount = labels?.Count ?? 0; - using (var connection = _connectionFactory.GetConnection()) { - var dummyDatabaseQuery = @" - DECLARE @timezone INT - DECLARE @idUser INT - - SELECT - @timezone = offset - ,@idUser = u.IdUser - FROM dbo.usertimezone timezone - INNER JOIN dbo.[user] u ON u.idusertimezone = timezone.idusertimezone - WHERE u.[Email] = @userName; - - SELECT - RPT.[IdUser] - ,RPT.[IdCampaign] - ,RPT.[Name] - ,dateadd(MINUTE, @timezone, RPT.[UTCSentDate]) AS [UTCSentDate] - ,RPT.[FromEmail] - ,RPT.[CampaignType] - ,RPT.[IdTestAB] - ,SUM(RPT.[Subscribers]) [Subscribers] - ,SUM(RPT.[Sent]) [Sent] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Sent]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2)) - END AS [DlvRate] - ,SUM(RPT.[Opens]) [Opens] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2)) - END AS [OpenRate] - ,SUM(RPT.[Unopens]) AS [Unopens] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Sent] - RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2)) - END AS [UnopenRate] - ,SUM(RPT.[Clicks]) [Clicks] - ,CASE - WHEN SUM(RPT.[Opens]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Clicks]) * 100.0 / SUM(RPT.[Opens]) AS DECIMAL(10,2)) - END AS [ClickToOpenRate] - ,SUM(RPT.[Hard] + RPT.[Soft]) [Bounces] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Hard] + RPT.[Soft]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(10,2)) - END AS [BounceRate] - ,SUM(RPT.[Unsubscribes]) [Unsubscribes] - ,CASE - WHEN SUM(RPT.[Sent]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Unsubscribes]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(10,2)) - END AS [UnsubscribeRate] - ,SUM(RPT.[Spam]) [Spam] - ,CASE - WHEN SUM(RPT.[Sent]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Spam]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(10,2)) - END AS [SpamRate] - ,RPT.[LabelName] - ,RPT.[LabelColour] - FROM( - SELECT - C.[IdUser] - ,C.[IdCampaign] - ,C.[Name] - ,C.[UTCSentDate] - ,C.[FromEmail] - ,C.[CampaignType] - ,C.[IdTestAB] - ,ISNULL(C.[AmountSentSubscribers],0) [Subscribers] - ,(ISNULL(C.[DistinctOpenedMailCount],0) + ISNULL(C.[UnopenedMailCount],0)) AS [Sent] - ,ISNULL(C.[DistinctOpenedMailCount],0) [Opens] - ,ISNULL(C.[UnopenedMailCount], 0) [Unopens] - ,ISNULL(C.[DistinctClickCount],0) [Clicks] - ,ISNULL(C.[HardBouncedMailCount],0) [Hard] - ,ISNULL (C.[SoftBouncedMailCount],0) [Soft] - ,ISNULL(C.[UnsubscriptionsCount], Unsubscribes.Unsubscribes) [Unsubscribes] - ,Unsubscribes.Spam [Spam] - ,L.[Name] [LabelName] - ,LC.[Colour] [LabelColour] - FROM [dbo].[Campaign] C WITH (NOLOCK) - JOIN [dbo].[User] U WITH (NOLOCK) - ON C.[IdUser] = U.[IdUser] - LEFT JOIN [dbo].[Label] L WITH (NOLOCK) - ON C.[IdLabel] = L.[IdLabel] - LEFT JOIN [dbo].[Colour] LC WITH (NOLOCK) - ON L.[IdColour] = LC.[IdColour] - LEFT JOIN ( - SELECT - COUNT( - CASE - WHEN S.IdUnsubscriptionReason <> 2 - AND S.UnsubscriptionSubreason NOT IN (2,3,4) - THEN 1 - END - ) [Unsubscribes] - ,COUNT( - CASE - WHEN S.IdUnsubscriptionReason = 2 - OR S.UnsubscriptionSubreason IN (2,3,4) - THEN 1 - END - ) [Spam] - ,c.IdCampaign - FROM dbo.campaign c - INNER JOIN dbo.subscriber s ON c.idcampaign = s.IdCampaign - WHERE c.iduser = @idUser - AND c.STATUS in (5, 9) - AND c.IdTestCampaign IS NULL - AND s.IdSubscribersStatus = 5 - GROUP BY c.IdCampaign - ) Unsubscribes ON c.idcampaign = Unsubscribes.IdCampaign - WHERE - U.[Email] = @userName - AND C.[Status] IN (5,9) - AND C.Active = 1 - AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate) - AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate) - AND (@campaignName IS NULL OR LOWER(LTRIM(RTRIM(C.[Name]))) LIKE '%' + LOWER(LTRIM(RTRIM(@campaignName))) + '%') - AND ( - @campaignType IS NULL - OR (LTRIM(RTRIM(@campaignType)) = '') - OR (@campaignType = 'TEST_AB' AND C.IdTestAB IS NOT NULL) - OR (C.CampaignType = @campaignType AND C.IdTestAB IS NULL) - ) - AND (@fromEmail IS NULL OR LOWER(LTRIM(RTRIM(C.[FromEmail]))) LIKE LOWER(LTRIM(RTRIM(@fromEmail)))) - AND C.[IdTestCampaign] IS NULL - AND C.[IdScheduledTask] IS NULL - AND (C.TestABCategory IS NULL OR C.TestABCategory = 3) - AND ( - @labelsCount = 0 - OR C.[IdLabel] IN @labels - ) - ) RPT - GROUP BY RPT.[IdUser] - ,RPT.[IdCampaign] - ,RPT.[Name] - ,RPT.[UTCSentDate] - ,RPT.[FromEmail] - ,RPT.[CampaignType] - ,RPT.[IdTestAB] - ,RPT.[LabelName] - ,RPT.[LabelColour] - ORDER BY RPT.[UTCSentDate] DESC - OFFSET @pageNumber * @pageSize ROWS - FETCH NEXT @pageSize ROWS ONLY"; + var labelsStr = (labels != null && labels.Count > 0) + ? string.Join(",", labels) + : null; - var results = await connection.QueryAsync(dummyDatabaseQuery, new { userName, pageNumber, pageSize, startDate, endDate, campaignName, campaignType, fromEmail, labelsCount, labels }); + var results = await connection.QueryAsync( + "[dbo].[CampaignsSent_CampaignsMetrics]", + new + { + userName, + startdate = startDate, + enddate = endDate, + campaignName, + campaignType, + fromEmail, + labels = labelsStr, + pageNumber, + pageSize + }, + commandType: System.Data.CommandType.StoredProcedure); return results.ToList(); } @@ -325,139 +206,18 @@ public async Task> GetMonthlyCampaignsMetrics(strin { using (var connection = _connectionFactory.GetConnection()) { - var dummyDatabaseQuery = @" - DECLARE @timezone INT - - SELECT @timezone = offset - FROM dbo.usertimezone timezone - INNER JOIN dbo.[user] u ON u.idusertimezone = timezone.idusertimezone - WHERE u.[Email] = @userName - - SELECT - RPT.[IdUser] - ,YEAR(dateadd(MINUTE, @timezone, UTCSentDate)) [Year] - ,MONTH(dateadd(MINUTE, @timezone, UTCSentDate)) [Month] - ,COUNT(DISTINCT RPT.[IdCampaign]) [CampaginsCount] - ,SUM(RPT.[Subscribers]) [Subscribers] - ,SUM(RPT.[Sent]) [Sent] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Sent]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2)) - END AS [DlvRate] - ,SUM(RPT.[Opens]) [Opens] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2)) - END AS [OpenRate] - ,SUM(RPT.[Unopens]) AS [Unopens] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Sent] - RPT.[Opens]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2)) - END AS [UnopenRate] - ,SUM(RPT.[Clicks]) [Clicks] - ,CASE - WHEN SUM(RPT.[Opens]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Clicks]) * 100.0 / SUM(RPT.[Opens]) AS DECIMAL(5,2)) - END AS [ClickToOpenRate] - ,SUM(RPT.[Hard] + RPT.[Soft]) [Bounces] - ,CASE - WHEN SUM(RPT.[Subscribers]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Hard] + RPT.[Soft]) * 100.0 / SUM(RPT.[Subscribers]) AS DECIMAL(5,2)) - END AS [BounceRate] - ,SUM(RPT.[Unsubscribes]) [Unsubscribes] - ,CASE - WHEN SUM(RPT.[Sent]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Unsubscribes]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(5,2)) - END AS [UnsubscribeRate] - ,SUM(RPT.[Spam]) [Spam] - ,CASE - WHEN SUM(RPT.[Sent]) = 0 THEN 0 - ELSE CAST(SUM(RPT.[Spam]) * 100.0 / SUM(RPT.[Sent]) AS DECIMAL(5,2)) - END AS [SpamRate] - FROM( - SELECT - C.[IdUser] - ,C.[IdCampaign] - ,C.[UTCSentDate] - ,ISNULL(C.[AmountSentSubscribers],0) [Subscribers] - ,(ISNULL(C.AmountSentSubscribers, 0) - (ISNULL(C.HardBouncedMailCount, 0) + ISNULL(C.SoftBouncedMailCount, 0))) AS [Sent] - ,ISNULL(C.[DistinctOpenedMailCount],0) [Opens] - ,ISNULL(C.[UnopenedMailCount], 0) [Unopens] - ,ISNULL(C.[DistinctClickCount],0) [Clicks] - ,ISNULL(C.[HardBouncedMailCount],0) [Hard] - ,ISNULL(C.[SoftBouncedMailCount],0) [Soft] - ,ISNULL(C.[UnsubscriptionsCount],0) [Unsubscribes] - ,0 [Spam] - FROM [dbo].[Campaign] C WITH (NOLOCK) - JOIN [dbo].[User] U WITH (NOLOCK) - ON C.[IdUser] = U.[IdUser] - WHERE - U.[Email] = @userName - AND C.[Status] IN (5,9) - AND C.Active = 1 - AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate) - AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate) - AND C.[IdTestCampaign] IS NULL - AND C.[IdScheduledTask] IS NULL - AND (C.TestABCategory IS NULL OR C.TestABCategory = 3) - UNION ALL - SELECT - S.[IdUser] - ,S.[IdCampaign] - ,C.[UTCSentDate] - ,0 [Subscribers] - ,0 [Sent] - ,0 [Opens] - ,0 [Unopens] - ,0 [Clicks] - ,0 [Hard] - ,0 [Soft] - ,COUNT( - CASE - WHEN S.IdUnsubscriptionReason <> 2 - AND S.UnsubscriptionSubreason NOT IN (2,3,4) - THEN 1 - END - ) [Unsubscribes] - ,COUNT( - CASE - WHEN S.IdUnsubscriptionReason = 2 - OR S.UnsubscriptionSubreason IN (2,3,4) - THEN 1 - END - ) [Spam] - FROM [dbo].[Subscriber] S WITH (NOLOCK) - JOIN [dbo].[Campaign] C WITH (NOLOCK) - ON S.[IdUser] = C.[IdUser] AND S.[IdCampaign] = C.[IdCampaign] - JOIN [dbo].[User] U WITH (NOLOCK) - ON S.[IdUser] = U.[IdUser] - WHERE - U.[Email] = @userName - AND C.[Status] IN (5,9) - AND C.Active = 1 - AND (@startDate IS NULL OR C.[UTCSentDate] >= @startDate) - AND (@endDate IS NULL OR C.[UTCSentDate] < @endDate) - AND C.[IdTestCampaign] IS NULL - AND C.[IdScheduledTask] IS NULL - AND (C.TestABCategory IS NULL OR C.TestABCategory = 3) - AND S.IdSubscribersStatus = 5 - GROUP BY - S.[IdUser] - ,S.[IdCampaign] - ,C.[Name] - ,C.[UTCSentDate] - ,C.[FromEmail] - ,C.[CampaignType] - ) RPT - GROUP BY RPT.[IdUser] - ,YEAR(dateadd(MINUTE, @timezone, UTCSentDate)) - ,MONTH(dateadd(MINUTE, @timezone, UTCSentDate)) - - ORDER BY [Year] DESC, [Month] DESC - OFFSET @pageNumber * @pageSize ROWS - FETCH NEXT @pageSize ROWS ONLY"; - - var results = await connection.QueryAsync(dummyDatabaseQuery, new { userName, pageNumber, pageSize, startDate, endDate }); + var results = await connection.QueryAsync( + "[dbo].[CampaignsSent_CampaignsByMonthMetrics]", + new + { + userName, + startdate = startDate, + enddate = endDate, + pageNumber, + pageSize + }, + commandType: System.Data.CommandType.StoredProcedure + ); return results.ToList(); }