private List<SiteDetails> getOfflineSitesToReport(List<string> healthboardsThatHaveExceededNumberOfOfflineSitesToBeReportedLimit)
        {
            // Get offline sites to be reported
            var sitesToBeReportedInOfflineSitesTable = (from x in _reportingEntity.tbRPT_OfflineSites
                                                        where x.DateOfflineNotificationSent == null
                                                        && !(healthboardsThatHaveExceededNumberOfOfflineSitesToBeReportedLimit.Contains(x.Healthboard))
                                                        select x);

            List<SiteDetails> offlineSitesToReport = new List<SiteDetails>();

            foreach (var siteToBeReportedOffline in sitesToBeReportedInOfflineSitesTable)
            {
                string orgId = siteToBeReportedOffline.Org;
                string supplier = siteToBeReportedOffline.Supplier;
                string healthboard = siteToBeReportedOffline.Healthboard;
                string orgName = getOrgName(orgId);
                string supplierRef = getSupplierReference(orgId);
                DateTime? lastMsgDate = getLastMessageDate(orgId);

                SiteDetails siteToBeReportedDetails = new SiteDetails(orgId, orgName, healthboard, supplier, supplierRef, lastMsgDate);
                offlineSitesToReport.Add(siteToBeReportedDetails);
            }

            return offlineSitesToReport;
        }
        private string setEmailBody(SiteDetails siteToBeReportedOffline)
        {
            string emailBody = null;

            if (siteToBeReportedOffline.Supplier == "EMIS")
                emailBody = setEmailBodyForEmisSite(siteToBeReportedOffline);
            else if (siteToBeReportedOffline.Supplier == "INPS")
                emailBody = setEmailBodyForInpsSite(siteToBeReportedOffline);

            return emailBody;
        }
        private string setEmailBodyForEmisSite(SiteDetails siteToBeReportedOffline)
        {
            string emailBody = null;

            emailBody =
                "Transmission Fault in ePharmacy\n\n"
                + "This site ("
                + siteToBeReportedOffline.OrgName + ", CDB "
                + siteToBeReportedOffline.SupplierReference + ", OrgID "
                + siteToBeReportedOffline.OrgId
                + ") is reported as being offline. The last AMS message was received on "
                + siteToBeReportedOffline.LastMessageDate
                + "\n Please arrange for this to be investigated and brought back online as soon as possible.";

            return emailBody;
        }
        private MailMessage CreateOfflineReport(SiteDetails siteToBeReportedOffline)
        {
            MailMessage offlineReport = new MailMessage();

            // Get email address information
            MailAddress fromAddress = _repository.GetOfflineReportFromAddress();
            MailAddress replyToAddress = _repository.GetOfflineReportReplyToAddress();
            List<MailAddress> toAddresses = _repository.GetOfflineReportRecipients(siteToBeReportedOffline.Healthboard, siteToBeReportedOffline.Supplier);

            // Set email address information
            offlineReport.From = fromAddress;
            offlineReport.ReplyTo = replyToAddress;
            foreach (MailAddress toAddress in toAddresses)
                offlineReport.To.Add(toAddress);

            offlineReport.Subject = setEmailSubject(siteToBeReportedOffline);
            offlineReport.Body = setEmailBody(siteToBeReportedOffline);

            return offlineReport;
        }
        public void CreateOfflineReports_MultipleOfflineSitesToBeReported_ReturnsExpectedOfflineReports()
        {
            string orgId1 = "1111";
            string orgName1 = "testName1";
            string healthboard1 = "testHealthboard";
            string supplier1 = "EMIS";
            string supplierReference1 = "emisRef";

            string orgId2 = "2222";
            string orgName2 = "testName2";
            string healthboard2 = "testHealthboard2";
            string supplier2 = "INPS";
            string supplierReference2 = "inpsRef";

            DateTime lastMessageDate = DateTime.Now.AddDays(-7);

            SiteDetails siteToBeReportedOffline1 = new SiteDetails(orgId1, orgName1, healthboard1, supplier1, supplierReference1, lastMessageDate);
            SiteDetails siteToBeReportedOffline2 = new SiteDetails(orgId2, orgName2, healthboard2, supplier2, supplierReference2, lastMessageDate);
            List<SiteDetails> sitesToBeReportedOffline = new List<SiteDetails>();
            sitesToBeReportedOffline.Add(siteToBeReportedOffline1);
            sitesToBeReportedOffline.Add(siteToBeReportedOffline2);

            MailAddress fromAddress = new MailAddress("*****@*****.**");
            MailAddress replyToAddress = new MailAddress("*****@*****.**");
            MailAddress supplierAddress = new MailAddress("*****@*****.**");
            MailAddress healthboardAddress = new MailAddress("*****@*****.**");
            List<MailAddress> receipients = new List<MailAddress>();
            receipients.Add(supplierAddress);
            receipients.Add(healthboardAddress);

            // Setup repository to return expected email addresses
            repositoryMock.Setup(x => x.GetOfflineReportFromAddress()).Returns(fromAddress);
            repositoryMock.Setup(x => x.GetOfflineReportReplyToAddress()).Returns(replyToAddress);
            repositoryMock.Setup(x => x.GetOfflineReportRecipients(It.IsAny<string>(), It.IsAny<string>())).Returns(receipients);

            string expectedLastMessageDateString = lastMessageDate.ToString();

            string expectedEmisEmailSubject = "Transmission Fault in ePharmacy CDB emisRef (OrgID 1111)";
            string expectedEmisEmailBody = "Transmission Fault in ePharmacy\n\n"
                + "This site (testName1, CDB emisRef, OrgID 1111) is reported as being offline. The last AMS message was received on "
                + expectedLastMessageDateString
                + "\n Please arrange for this to be investigated and brought back online as soon as possible.";

            string expectedInpsEmailSubject = "eAMS Offline - INPS Reference inpsRef (OrgID 2222)";
            string expectedInpsEmailBody = "eAMS Offline\n\n"
                + "This site (testName2, INPS Reference inpsRef, OrgID 2222) is reported as being offline. The last AMS message was received on "
                + expectedLastMessageDateString
                + "\n Please arrange for this to be investigated and brought back online as soon as possible.";

            SendOfflineNotifications sendOfflineNotifications = new SendOfflineNotifications(repository, smtpClient);

            Dictionary<string, MailMessage> result;
            result = sendOfflineNotifications.CreateOfflineReports(sitesToBeReportedOffline);

            Assert.AreEqual(2, result.Count);
            MailMessage offlineReport1 = result[orgId1];
            Assert.AreEqual(fromAddress, offlineReport1.From);
            Assert.AreEqual(replyToAddress, offlineReport1.ReplyTo);
            Assert.AreEqual(receipients[0], offlineReport1.To[0]);
            Assert.AreEqual(receipients[1], offlineReport1.To[1]);
            Assert.AreEqual(expectedEmisEmailSubject, offlineReport1.Subject);
            Assert.AreEqual(expectedEmisEmailBody, offlineReport1.Body);
            MailMessage offlineReport2 = result[orgId2];
            Assert.AreEqual(fromAddress, offlineReport2.From);
            Assert.AreEqual(replyToAddress, offlineReport2.ReplyTo);
            Assert.AreEqual(receipients[0], offlineReport2.To[0]);
            Assert.AreEqual(receipients[1], offlineReport2.To[1]);
            Assert.AreEqual(expectedInpsEmailSubject, offlineReport2.Subject);
            Assert.AreEqual(expectedInpsEmailBody, offlineReport2.Body);
        }
        public void CreateOfflineReports_SingleInpsSiteToBeReported_ReturnsInpsReport()
        {
            string orgId = "1111";
            string orgName = "testName";
            string healthboard = "testHealthboard";
            string supplier = "INPS";
            string supplierReference = "testRef";
            DateTime lastMessageDate = DateTime.Now.AddDays(-7);
            SiteDetails emisSiteToBeReportedOffline = new SiteDetails(orgId, orgName, healthboard, supplier, supplierReference, lastMessageDate);
            List<SiteDetails> sitesToBeReportedOffline = new List<SiteDetails>();
            sitesToBeReportedOffline.Add(emisSiteToBeReportedOffline);

            MailAddress fromAddress = new MailAddress("*****@*****.**");
            MailAddress replyToAddress = new MailAddress("*****@*****.**");
            MailAddress emisAddress = new MailAddress("*****@*****.**");
            MailAddress healthboardAddress = new MailAddress("*****@*****.**");
            List<MailAddress> receipients = new List<MailAddress>();
            receipients.Add(emisAddress);
            receipients.Add(healthboardAddress);

            // Setup repository to return expected email addresses
            repositoryMock.Setup(x => x.GetOfflineReportFromAddress()).Returns(fromAddress);
            repositoryMock.Setup(x => x.GetOfflineReportReplyToAddress()).Returns(replyToAddress);
            repositoryMock.Setup(x => x.GetOfflineReportRecipients(healthboard, supplier)).Returns(receipients);

            string expectedEmailSubject = "eAMS Offline - INPS Reference testRef (OrgID 1111)";
            string expectedLastMessageDateString = lastMessageDate.ToString();
            string expectedEmailBody = "eAMS Offline\n\n"
                + "This site (testName, INPS Reference testRef, OrgID 1111) is reported as being offline. The last AMS message was received on "
                + expectedLastMessageDateString
                + "\n Please arrange for this to be investigated and brought back online as soon as possible.";

            SendOfflineNotifications sendOfflineNotifications = new SendOfflineNotifications(repository, smtpClient);

            Dictionary<string, MailMessage> result;
            result = sendOfflineNotifications.CreateOfflineReports(sitesToBeReportedOffline);

            Assert.AreEqual(1, result.Count);
            MailMessage offlineReport = result[orgId];
            Assert.AreEqual(fromAddress, offlineReport.From);
            Assert.AreEqual(replyToAddress, offlineReport.ReplyTo);
            Assert.AreEqual(receipients[0], offlineReport.To[0]);
            Assert.AreEqual(receipients[1], offlineReport.To[1]);
            Assert.AreEqual(expectedEmailSubject, offlineReport.Subject);
            Assert.AreEqual(expectedEmailBody, offlineReport.Body);
        }
        private string setEmailSubjectForInpsSite(SiteDetails siteToBeReportedOffline)
        {
            string emailSubject;

            emailSubject = "eAMS Offline - INPS Reference " + siteToBeReportedOffline.SupplierReference +
                " (OrgID " + siteToBeReportedOffline.OrgId + ")";

            return emailSubject;
        }
        private string setEmailSubjectForEmisSite(SiteDetails siteToBeReportedOffline)
        {
            string emailSubject;

            emailSubject = "Transmission Fault in ePharmacy CDB " + siteToBeReportedOffline.SupplierReference +
                " (OrgID " + siteToBeReportedOffline.OrgId + ")";

            return emailSubject;
        }