using System; using System.Collections.Generic; using System.Linq; using System.Text; using Pluto.Api; using McKesson.PPS.Fusion.Authentication.Business; using McKesson.PPS.Fusion.Communications.Business.Folders; using McKesson.PPS.Fusion.Communications.Business; using McKesson.PPS.Fusion.Communications.Business.Commands; using McKesson.PPS.Fusion.Communications.Business.FolderContents; using McKesson.PPS.Fusion.Communications.Data.Service; using McKesson.PPS.Fusion.Communications.Business.FolderContents.Edit; using McKesson.PPS.Fusion.Communications.Business.FolderContents.Recepients; using McKesson.PPS.Fusion.Communications.Business.Lookups; using McKesson.PPS.Fusion.Communications.Data.Entity; using McKesson.PPS.Fusion.Business.Shared.Communications; namespace PlutoServer.PracticeChoice.Core { public class Provider { public void SendMessage(string authToken, MessageInfo1 message) { MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var msg = Message.NewMessage(); msg.ActivateDate = DateTime.Now; msg.Body = message.Body; msg.Subject = message.Subject; foreach(var item in message.ToList) { var recipient = RecepientPerson.CreateNewInstance(item.Id); msg.ToList.Add(recipient); } msg.Priority = new McKesson.PPS.Fusion.Communications.Business.Lookups.PriorityType(1, "Default"); msg.SendMessage(false); } } public IList GetMailboxFoldersInfo(string authToken, int providerId) { IList foldersInfoList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var folderList = FolderList.GetFolders(); if(folderList != null) { foldersInfoList = new List(); foreach(var folder in folderList) { foldersInfoList.Add(new MailboxFolderInfo1() { Name = folder.DisplayName, ReadCount = folder.ReadCount, TotalCount = folder.TotalCount, Type = (MailboxFolderTypeEnum)folder.FolderType }); } } } return foldersInfoList; } public MessageInfo1 GetMessage(string authToken, long messageId) { MessageInfo1 messageInfo = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var msgId = (int)messageId; var msg = Message.Get(msgId); if(msg != null) { var bccList = this.GetMessageRecipientList(msg.BccList); var ccList = this.GetMessageRecipientList(msg.CcList); var toList = this.GetMessageRecipientList(msg.ToList); messageInfo = new MessageInfo1() { BccList = bccList == null? null : bccList.ToArray(), Body = msg.Body, CcList = ccList == null ? null : ccList.ToArray(), ChartId = msg.ChartId.HasValue?msg.ChartId.Value:0, DateSent = msg.DateSent, From = msg.FromText, HeaderId = msg.HeaderId, IsReceiptRequired = msg.IsReceiptRequired, IsRecorded = msg.IsRecorded, MessageSendType = (MessageSendTypeEnum)msg.MessageSendType, PatientId = msg.PatientId, SenderId = msg.SenderId, ToList = toList == null?null:toList.ToArray() }; } } return messageInfo; } private IList GetMessageRecipientList(RecepientList recipientList) { IList list = null; if((recipientList != null) && (recipientList.Count > 0)) { list = new List(); foreach(var item in recipientList) { list.Add(new MessageRecipientInfo1() { Id = item.ID, Name = item.DisplayName }); } } return list; } private FolderCriteria GetFolderCriteria(MagicIdentity identity, MailboxFolderTypeEnum folderType) { FolderCriteria folderCriteria = null; switch(folderType) { case MailboxFolderTypeEnum.Inbox: folderCriteria = new InboxFolderCriteria(identity.PersonId, identity.PracticeId); break; case MailboxFolderTypeEnum.Sent: folderCriteria = new SentFolderCriteria(identity.PersonId, identity.PracticeId); break; case MailboxFolderTypeEnum.Saved: folderCriteria = new SavedFolderCriteria(identity.PersonId, identity.PracticeId); break; case MailboxFolderTypeEnum.Done: folderCriteria = new DoneFolderCriteria(identity.PersonId, identity.PracticeId); break; case MailboxFolderTypeEnum.Outbox: folderCriteria = new OutboxFolderCriteria(identity.PersonId, identity.PracticeId); break; case MailboxFolderTypeEnum.Draft: folderCriteria = new DraftFolderCriteria(identity.PersonId, identity.PracticeId); break; default: break; } return folderCriteria; } public IList GetMailboxItems(string authToken, MailboxFolderTypeEnum folderType) { IList itemsList = null; MagicIdentity identity = MagicIdentity.FromCookieString(authToken); if(identity.IsAuthenticated) { MagicPrincipal principal = new MagicPrincipal(identity); Csla.ApplicationContext.User = principal; var criteria = this.GetFolderCriteria(identity, folderType); Dictionary args = new Dictionary() { { "criteria", criteria } }; using(var ds = DataServiceLocator.Resolve(args)) { var result = ds.GetFolderItems(); if(result != null) { itemsList = new List(); switch(folderType) { case MailboxFolderTypeEnum.Inbox: LoadMailboxFolderItems(itemsList, result); break; case MailboxFolderTypeEnum.Sent: LoadMailboxFolderItems(itemsList, result); break; case MailboxFolderTypeEnum.Saved: LoadMailboxFolderItems(itemsList, result); break; case MailboxFolderTypeEnum.Done: LoadMailboxFolderItems(itemsList, result); break; case MailboxFolderTypeEnum.Outbox: LoadMailboxFolderItems(itemsList, result); break; case MailboxFolderTypeEnum.Draft: LoadMailboxFolderItems(itemsList, result); break; default: break; } } } } return itemsList; } private Dictionary> FolderItemFactories { get { var factory = new Dictionary>(); factory.Add(typeof(InboxFolderItem), (data) => InboxFolderItem.GetInstance(data)); factory.Add(typeof(SentFolderItem), (data) => SentFolderItem.GetInstance(data)); factory.Add(typeof(DoneFolderItem), (data) => DoneFolderItem.GetInstance(data)); factory.Add(typeof(SavedFolderItem), (data) => SavedFolderItem.GetInstance(data)); factory.Add(typeof(OutboxFolderItem), (data) => OutboxFolderItem.GetInstance(data)); factory.Add(typeof(DraftFolderItem), (data) => DraftFolderItem.GetInstance(data)); return factory; } } private void LoadMailboxFolderItems(IList inboxItemsList, IList folderItemsList) where TFolderItemType : ReadOnlyMailboxItem { foreach(var folderItemData in folderItemsList) { var item = (TFolderItemType)FolderItemFactories[typeof(TFolderItemType)].Invoke(folderItemData); var folderItemInfo = GetFolderItemInfo(item); folderItemInfo.To = GetTo(item); inboxItemsList.Add(folderItemInfo); } } private MessageRecipientInfo1 GetSender(ReadOnlyMailboxItem mailboxItem) where T : ReadOnlyMailboxItem { var recipient = (RecepientPerson)mailboxItem.Sender; return new MessageRecipientInfo1() { Id = recipient.ID, Name = recipient.DisplayName }; } private string GetTo(T mailboxItem) { var messageTo = string.Empty; if(typeof(T).IsAssignableFrom(typeof(SentFolderItem))) { messageTo = ((SentFolderItem)((object)mailboxItem)).ToName; }else if(typeof(T).IsAssignableFrom(typeof(DoneFolderItem))){ messageTo = ((DoneFolderItem)((object)mailboxItem)).ToName; } else if (typeof(T).IsAssignableFrom(typeof(DraftFolderItem))){ messageTo = ((DraftFolderItem)((object)mailboxItem)).ToNames; } else if (typeof(T).IsAssignableFrom(typeof(SavedFolderItem))){ messageTo = ((SavedFolderItem)((object)mailboxItem)).ToName; } else if(typeof(T).IsAssignableFrom(typeof(OutboxFolderItem))){ messageTo = ((OutboxFolderItem)((object)mailboxItem)).ToNames; } return messageTo; } private FolderItemInfo1 GetFolderItemInfo(ReadOnlyMailboxItem item) where T : ReadOnlyMailboxItem { return new FolderItemInfo1() { CategoryType = (MessageCategoryEnum)item.CategoryType, ChartId = item.ChartId.HasValue ? item.ChartId.Value : 0, DateTransceived = item.DateTransceived, FolderType = (MailboxFolderTypeEnum)item.FolderLocation, From = item.FromText, Id = item.Id, IsRead = item.IsRead, PatientId = item.PatientId, PatientName = item.PatientName, Priority = item.PriorityName, SentDate = item.SentDate, Subject = item.Subject, Sender = GetSender(item) }; } } }