public void OrderReceived(Order order, LineItem lineItem, User actor, decimal quantity, string overrideDescription = null)
        {
            var queues = new List <EmailQueueV2>();

            var description = overrideDescription;

            if (string.IsNullOrWhiteSpace(description))
            {
                description = string.Format("{0} item(s) by {1}.", quantity, actor.FullName);
            }

            // get the order's purchaser
            // var purchasers = order.OrderTrackings.Where(a => a.StatusCode.Id == OrderStatusCode.Codes.Complete).ToList();

            if (!string.IsNullOrEmpty(order.Workgroup.NotificationEmailList))
            {
                //var emailQueue = new EmailQueue(order, EmailPreferences.NotificationTypes.PerEvent, string.Format(ReceiveMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, quantity), actor, order.Workgroup.NotificationEmailList);
                var emailQueue2 = new EmailQueueV2(order, EmailPreferences.NotificationTypes.PerEvent, "Received", description, null, order.Workgroup.NotificationEmailList);
                AddToQueue(queues, emailQueue2);
            }

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Received, order.OrderType))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ReceiveMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, quantity), approval.User);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Received", description, approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderAddNote(Order order, User actor, string comment)
        {
            var users        = order.OrderTrackings.Select(a => a.User).Distinct().ToList();
            var shortComment = comment ?? string.Empty;

            if (comment != null && comment.Length > 100)
            {
                shortComment = comment.Substring(0, 100) + "...";
            }


            foreach (var ot in users)
            {
                if (!ot.IsActive) //Not active, we don't want to email them
                {
                    continue;
                }
                var preference = GetEmailPreferences(ot.Id);

                if (preference.AddNote)
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(AddNoteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), ot);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Note Added", string.Format("By {0} with the note \"{1}\".", actor.FullName, shortComment), ot);
                    order.AddEmailQueue(emailQueue2);
                }
            }
        }
        public void OrderPaid(Order order, LineItem lineItem, User actor, decimal quantity, string overrideDescription = null)
        {
            var queues = new List <EmailQueueV2>();

            var description = overrideDescription;

            if (string.IsNullOrWhiteSpace(description))
            {
                description = string.Format("{0} item(s) by {1}.", quantity, actor.FullName);
            }

            if (!string.IsNullOrEmpty(order.Workgroup.NotificationEmailList))
            {
                var emailQueue2 = new EmailQueueV2(order, EmailPreferences.NotificationTypes.PerEvent, "Paid", description, null, order.Workgroup.NotificationEmailList);
                AddToQueue(queues, emailQueue2);
            }

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Paid, order.OrderType))
                {
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Paid", description, approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderApproved(Order order, Approval approval)
        {
            var queues = new List <EmailQueueV2>();

            // go through all the tracking history
            foreach (var appr in order.OrderTrackings.Where(a => a.StatusCode.Level < approval.StatusCode.Level).Select(a => new { User = a.User, StatusCode = a.StatusCode }).Distinct())
            {
                var user       = appr.User;
                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, appr.StatusCode, approval.StatusCode, EventCode.Approval))
                {
                    var currentUser = _userRepository.GetNullableById(_userIdentity.Current);
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ApprovalMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, currentUser.FullName, approval.StatusCode.Name), user);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Approved", string.Format("By {0} at {1} review.", currentUser.FullName, approval.StatusCode.Name), user);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);

            // is the current level complete?
            if (!order.Approvals.Where(a => a.StatusCode.Level == order.StatusCode.Level && !a.Completed).Any())
            {
                // look forward to the next level
                var level = order.StatusCode.Level + 1;

                ProcessArrival(order, approval, level);
            }
        }
Exemple #5
0
        public static EmailQueueV2 EmailQueueV2(int?counter)
        {
            var rtValue = new EmailQueueV2();

            rtValue.Action           = "Text" + counter.Extra();
            rtValue.Order            = new Order();
            rtValue.NotificationType = Purchasing.Core.Domain.EmailPreferences.NotificationTypes.PerEvent;

            return(rtValue);
        }
        public void ProcessArrival(Order order, Approval approval, int level, bool assigned = false)
        {
            // find all the approvals at the next level
            var future = order.Approvals.Where(a => a.StatusCode.Level == level);

            // check for any approvals not specifically assigned to anyone
            var wrkgrp = future.Any(a => a.User == null);

            // get the current user
            var currentUser = _userRepository.GetNullableById(_userIdentity.Current);

            var queues = new List <EmailQueueV2>();

            // there is at least one that is workgroup permissions
            if (wrkgrp)
            {
                var peeps = order.Workgroup.Permissions.Where(a => a.Role.Level == level && (!a.IsAdmin || (a.IsAdmin && a.IsFullFeatured))).Select(a => a.User);

                var apf = future.First(a => a.User == null);

                foreach (var peep in peeps)
                {
                    if (!peep.IsActive) //Not active, we don't want to email them
                    {
                        continue;
                    }
                    var preference = GetEmailPreferences(peep.Id);

                    if (IsMailRequested(preference, apf.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                    {
                        var extraInfo = string.Empty;
                        if (preference.ShowAccountInEmail && apf.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                        {
                            extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                        }
                        //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ArrivalMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, apf.StatusCode.Name, currentUser.FullName, extraInfo), peep);
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", apf.StatusCode.Name, currentUser.FullName, extraInfo), peep);
                        AddToQueue(queues, emailQueue2);
                    }
                }

                // find any that still need to be sent regardless (outside of workgroup)
                var aps = future.Where(a => a.User != null && !peeps.Contains(a.User));

                ProcessApprovalsEmailQueue(order, approval, queues, currentUser, aps, assigned);
            }
            else
            {
                // check each of the approvals
                ProcessApprovalsEmailQueue(order, approval, queues, currentUser, future, assigned);
            }

            AddQueuesToOrder(order, queues);
        }
 /// <summary>
 /// Add email queue to a list, but check to ensure no duplicates
 /// </summary>
 /// <param name="emailQueues"></param>
 /// <param name="emailQueue"></param>
 private void AddToQueue(List <EmailQueueV2> emailQueues, EmailQueueV2 emailQueue)
 {
     if (emailQueue.User != null && !emailQueue.User.IsActive)
     {
         return;
     }
     if (!emailQueues.Any(a => a.User == emailQueue.User))
     {
         emailQueues.Add(emailQueue);
     }
 }
        private void ProcessApprovalsEmailQueue(Order order, Approval approval, List <EmailQueueV2> queues, User currentUser, IEnumerable <Approval> aps, bool assigned = false)
        {
            foreach (var ap in aps)
            {
                // load the user and information
                var user = ap.User;

                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, ap.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                {
                    var extraInfo = string.Empty;
                    if (preference.ShowAccountInEmail && ap.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                    {
                        extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                    }
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(!assigned ? ArrivalMessage : RerouteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                    if (!assigned)
                    {
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                        AddToQueue(queues, emailQueue2);
                    }
                    else
                    {
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Rerouted", string.Format("To you at your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                        AddToQueue(queues, emailQueue2);
                    }
                }

                if (ap.SecondaryUser != null)
                {
                    if (IsMailRequested(preference, ap.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                    {
                        var extraInfo = string.Empty;
                        if (preference.ShowAccountInEmail && ap.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                        {
                            extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                        }
                        //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(!assigned ? ArrivalMessage : RerouteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                        if (!assigned)
                        {
                            var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                            AddToQueue(queues, emailQueue2);
                        }
                        else
                        {
                            var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Rerouted", string.Format("To you at your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                            AddToQueue(queues, emailQueue2);
                        }
                    }
                }
            }
        }
        public void OrderCancelled(Order order, User actor, string cancelReason, OrderStatusCode previousStatus)
        {
            var user             = order.CreatedBy;
            var preference       = _emailPreferenceRepository.GetNullableById(user.Id);
            var notificationType = EmailPreferences.NotificationTypes.PerEvent;

            if (preference != null)
            {
                notificationType = preference.NotificationType;
            }

            //var emailQueue = new EmailQueue(order, notificationType, string.Format(CancellationMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName, order.StatusCode.Name, cancelReason), user);
            var emailQueue2 = new EmailQueueV2(order, notificationType, "Cancelled", string.Format("By {0} at {1} review with the comment  \"{2}\".", actor.FullName, previousStatus.Name, cancelReason), user);

            order.AddEmailQueue(emailQueue2);
        }
        public void OrderDenied(Order order, User user, string comment, OrderStatusCode previousStatus)
        {
            var queues = new List <EmailQueueV2>();

            foreach (var appr in order.OrderTrackings.Select(a => new { User = a.User, StatusCode = a.StatusCode }).Distinct())
            {
                var target     = appr.User;
                var preference = GetEmailPreferences(user.Id);

                //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(CancellationMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, user.FullName, order.StatusCode.Name, comment), target);
                var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Denied", string.Format("By {0} at {1} review with the following comment \"{2}\".", user.FullName, previousStatus.Name, comment), target);
                //order.AddEmailQueue(emailQueue);
                AddToQueue(queues, emailQueue2);
            }

            AddQueuesToOrder(order, queues);
        }
        /// <summary>
        /// Tested Feb 17, 2012
        /// </summary>
        /// <param name="order"></param>
        public void OrderCreated(Order order)
        {
            var user       = order.CreatedBy;
            var preference = GetEmailPreferences(user.Id);

            if (preference.RequesterOrderSubmission)
            {
                //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(SubmissionMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name), user);
                var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Submitted", null, user);
                order.AddEmailQueue(emailQueue2);
            }

            // add the approvers/account managers that are "next" to see if they want the "arrival" email
            // get the lowest level
            var level = order.Approvals.Where(a => !a.Completed).Min(a => a.StatusCode.Level);

            ProcessArrival(order, null, level);
        }
        public void OrderCompleted(Order order, User user)
        {
            var queues = new List <EmailQueueV2>();

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Approval))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(CompleteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, user.FullName, order.OrderType.Name), approval.User);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Completed", string.Format("By {0} as a {1}.", user.FullName, order.OrderType.Name), approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderAddAttachment(Order order, User actor)
        {
            var users = order.OrderTrackings.Select(a => a.User).Distinct().ToList();

            foreach (var ot in users)
            {
                if (!ot.IsActive) //Not active, we don't want to email them
                {
                    continue;
                }
                var preference = GetEmailPreferences(ot.Id);

                if (preference.AddAttachment)
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(AddAttachmentMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), ot);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Attachment Added", string.Format("By {0}.", actor.FullName), ot);
                    order.AddEmailQueue(emailQueue2);
                }
            }
        }
        public void OrderEdited(Order order, User actor)
        {
            var queues = new List <EmailQueueV2>();

            // go through all the tracking history
            foreach (var appr in order.OrderTrackings.Where(a => a.StatusCode.Level <= order.StatusCode.Level).Select(a => new { User = a.User, StatusCode = a.StatusCode }).Distinct())
            {
                var user       = appr.User;
                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, appr.StatusCode, order.StatusCode, EventCode.Update))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ChangeMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), user);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Changed", string.Format("By {0} at {1} review.", actor.FullName, order.StatusCode.Name), user);
                    //order.AddEmailQueue(emailQueue);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderCancelled(Order order, User actor, string cancelReason, OrderStatusCode previousStatus)
        {
            var user = order.CreatedBy;
            var preference = _emailPreferenceRepository.GetNullableById(user.Id);
            var notificationType = EmailPreferences.NotificationTypes.PerEvent;

            if (preference != null) { notificationType = preference.NotificationType; }

            //var emailQueue = new EmailQueue(order, notificationType, string.Format(CancellationMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName, order.StatusCode.Name, cancelReason), user);
            var emailQueue2 = new EmailQueueV2(order, notificationType, "Cancelled", string.Format("By {0} at {1} review with the comment  \"{2}\".", actor.FullName, previousStatus.Name, cancelReason), user);
            order.AddEmailQueue(emailQueue2);
        }
        public void OrderCompleted(Order order, User user)
        {
            var queues = new List<EmailQueueV2>();

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Approval))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(CompleteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, user.FullName, order.OrderType.Name), approval.User);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Completed", string.Format("By {0} as a {1}.", user.FullName, order.OrderType.Name), approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        /// <summary>
        /// Tested Feb 17, 2012
        /// </summary>
        /// <param name="order"></param>
        public void OrderCreated(Order order)
        {
            var user = order.CreatedBy;
            var preference = GetEmailPreferences(user.Id);

            if(preference.RequesterOrderSubmission)
            {
                //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(SubmissionMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name), user);
                var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Submitted", null, user);
                order.AddEmailQueue(emailQueue2);
            }

            // add the approvers/account managers that are "next" to see if they want the "arrival" email
            // get the lowest level
            var level = order.Approvals.Where(a => !a.Completed).Min(a => a.StatusCode.Level);

            ProcessArrival(order, null, level);
        }
        public void OrderDenied(Order order, User user, string comment, OrderStatusCode previousStatus)
        {
            var queues = new List<EmailQueueV2>();

            foreach (var appr in order.OrderTrackings.Select(a => new { User = a.User, StatusCode = a.StatusCode }).Distinct())
            {
                var target = appr.User;
                var preference = GetEmailPreferences(user.Id);

                //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(CancellationMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, user.FullName, order.StatusCode.Name, comment), target);
                var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Denied", string.Format("By {0} at {1} review with the following comment \"{2}\".", user.FullName, previousStatus.Name, comment), target);
                //order.AddEmailQueue(emailQueue);
                AddToQueue(queues, emailQueue2);
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderAddAttachment(Order order, User actor)
        {
            var users = order.OrderTrackings.Select(a => a.User).Distinct().ToList();
            foreach (var ot in users)
            {
                if (!ot.IsActive) //Not active, we don't want to email them
                {
                    continue;
                }
                var preference = GetEmailPreferences(ot.Id);

                if (preference.AddAttachment)
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(AddAttachmentMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), ot);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Attachment Added", string.Format("By {0}.", actor.FullName), ot);
                    order.AddEmailQueue(emailQueue2);
                }
            }
        }
        public void OrderPaid(Order order, LineItem lineItem, User actor, decimal quantity, string overrideDescription = null)
        {
            var queues = new List<EmailQueueV2>();

            var description = overrideDescription;
            if (string.IsNullOrWhiteSpace(description))
            {
                description = string.Format("{0} item(s) by {1}.", quantity, actor.FullName);
            }

            if (!string.IsNullOrEmpty(order.Workgroup.NotificationEmailList))
            {
                var emailQueue2 = new EmailQueueV2(order, EmailPreferences.NotificationTypes.PerEvent, "Paid", description, null, order.Workgroup.NotificationEmailList);
                AddToQueue(queues, emailQueue2);
            }

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Paid, order.OrderType))
                {
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Paid", description, approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderReceived(Order order, LineItem lineItem, User actor, decimal quantity, string overrideDescription = null)
        {
            var queues = new List<EmailQueueV2>();

            var description = overrideDescription;
            if (string.IsNullOrWhiteSpace(description))
            {
                description = string.Format("{0} item(s) by {1}.", quantity, actor.FullName);
            }

            // get the order's purchaser
            // var purchasers = order.OrderTrackings.Where(a => a.StatusCode.Id == OrderStatusCode.Codes.Complete).ToList();

            if (!string.IsNullOrEmpty(order.Workgroup.NotificationEmailList))
            {
                //var emailQueue = new EmailQueue(order, EmailPreferences.NotificationTypes.PerEvent, string.Format(ReceiveMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, quantity), actor, order.Workgroup.NotificationEmailList);
                var emailQueue2 = new EmailQueueV2(order, EmailPreferences.NotificationTypes.PerEvent, "Received", description, null, order.Workgroup.NotificationEmailList);
                AddToQueue(queues, emailQueue2);
            }

            foreach (var approval in order.OrderTrackings.Select(a => new { a.User, a.StatusCode }).Distinct())
            {
                var preference = GetEmailPreferences(approval.User.Id);

                if (IsMailRequested(preference, approval.StatusCode, order.StatusCode, EventCode.Received, order.OrderType))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ReceiveMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, quantity), approval.User);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Received", description, approval.User);
                    AddToQueue(queues, emailQueue2);
                }
            }

            AddQueuesToOrder(order, queues);
        }
        public void ProcessArrival(Order order, Approval approval, int level, bool assigned = false)
        {
            // find all the approvals at the next level
            var future = order.Approvals.Where(a => a.StatusCode.Level == level);

            // check for any approvals not specifically assigned to anyone
            var wrkgrp = future.Any(a => a.User == null);

            // get the current user
            var currentUser = _userRepository.GetNullableById(_userIdentity.Current);

            var queues = new List<EmailQueueV2>();

            // there is at least one that is workgroup permissions
            if (wrkgrp)
            {

                var peeps = order.Workgroup.Permissions.Where(a => a.Role.Level == level && (!a.IsAdmin || (a.IsAdmin && a.IsFullFeatured))).Select(a => a.User);

                var apf = future.First(a => a.User == null);

                foreach (var peep in peeps)
                {
                    if (!peep.IsActive) //Not active, we don't want to email them
                    {
                        continue;
                    }
                    var preference = GetEmailPreferences(peep.Id);

                    if (IsMailRequested(preference, apf.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                    {
                        var extraInfo = string.Empty;
                        if (preference.ShowAccountInEmail && apf.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                        {
                            extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                        }
                        //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ArrivalMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, apf.StatusCode.Name, currentUser.FullName, extraInfo), peep);
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", apf.StatusCode.Name, currentUser.FullName, extraInfo), peep);
                        AddToQueue(queues, emailQueue2);
                    }
                }

                // find any that still need to be sent regardless (outside of workgroup)
                var aps = future.Where(a => a.User != null && !peeps.Contains(a.User));

                ProcessApprovalsEmailQueue(order, approval, queues, currentUser, aps, assigned);
            }
            else
            {
                // check each of the approvals
                ProcessApprovalsEmailQueue(order, approval, queues, currentUser, future, assigned);
            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderApproved(Order order, Approval approval)
        {
            var queues = new List<EmailQueueV2>();

            // go through all the tracking history
            foreach (var appr in order.OrderTrackings.Where(a => a.StatusCode.Level < approval.StatusCode.Level).Select(a => new {User = a.User, StatusCode = a.StatusCode}).Distinct())
            {
                var user = appr.User;
                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, appr.StatusCode, approval.StatusCode, EventCode.Approval))
                {
                    var currentUser = _userRepository.GetNullableById(_userIdentity.Current);
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ApprovalMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, currentUser.FullName, approval.StatusCode.Name), user);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Approved", string.Format("By {0} at {1} review.", currentUser.FullName, approval.StatusCode.Name), user);
                    AddToQueue(queues, emailQueue2);
                }

            }

            AddQueuesToOrder(order, queues);

            // is the current level complete?
            if (!order.Approvals.Where(a => a.StatusCode.Level == order.StatusCode.Level && !a.Completed).Any())
            {
                // look forward to the next level
                var level = order.StatusCode.Level + 1;

                ProcessArrival(order, approval, level);
            }
        }
 /// <summary>
 /// Add email queue to a list, but check to ensure no duplicates
 /// </summary>
 /// <param name="emailQueues"></param>
 /// <param name="emailQueue"></param>
 private void AddToQueue(List<EmailQueueV2> emailQueues, EmailQueueV2 emailQueue)
 {
     if (emailQueue.User != null && !emailQueue.User.IsActive)
     {
         return;
     }
     if (!emailQueues.Any(a => a.User == emailQueue.User)) emailQueues.Add(emailQueue);
 }
        public static EmailQueueV2 EmailQueueV2(int? counter)
        {
            var rtValue = new EmailQueueV2();
            rtValue.Action = "Text" + counter.Extra();
            rtValue.Order = new Order();
            rtValue.NotificationType = Purchasing.Core.Domain.EmailPreferences.NotificationTypes.PerEvent;

            return rtValue;
        }
        public void OrderEdited(Order order, User actor)
        {
            var queues = new List<EmailQueueV2>();

            // go through all the tracking history
            foreach (var appr in order.OrderTrackings.Where(a => a.StatusCode.Level <= order.StatusCode.Level).Select(a => new { User = a.User, StatusCode = a.StatusCode }).Distinct())
            {
                var user = appr.User;
                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, appr.StatusCode, order.StatusCode, EventCode.Update))
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(ChangeMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), user);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Changed", string.Format("By {0} at {1} review.", actor.FullName, order.StatusCode.Name), user);
                    //order.AddEmailQueue(emailQueue);
                    AddToQueue(queues, emailQueue2);
                }

            }

            AddQueuesToOrder(order, queues);
        }
        public void OrderAddNote(Order order, User actor, string comment)
        {
            var users = order.OrderTrackings.Select(a => a.User).Distinct().ToList();
            var shortComment = comment ?? string.Empty;
            if (comment != null && comment.Length > 100)
            {
                shortComment = comment.Substring(0, 100) + "...";
            }

            foreach (var ot in users)
            {
                if (!ot.IsActive) //Not active, we don't want to email them
                {
                    continue;
                }
                var preference = GetEmailPreferences(ot.Id);

                if (preference.AddNote)
                {
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(AddNoteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, actor.FullName), ot);
                    var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Note Added", string.Format("By {0} with the note \"{1}\".", actor.FullName, shortComment), ot);
                    order.AddEmailQueue(emailQueue2);
                }
            }
        }
        private void ProcessApprovalsEmailQueue(Order order, Approval approval, List<EmailQueueV2> queues, User currentUser, IEnumerable<Approval> aps, bool assigned = false)
        {
            foreach (var ap in aps)
            {
                // load the user and information
                var user = ap.User;

                var preference = GetEmailPreferences(user.Id);

                if (IsMailRequested(preference, ap.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                {
                    var extraInfo = string.Empty;
                    if (preference.ShowAccountInEmail && ap.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                    {
                        extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                    }
                    //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(!assigned ? ArrivalMessage : RerouteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                    if (!assigned)
                    {
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                        AddToQueue(queues, emailQueue2);
                    }
                    else
                    {
                        var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Rerouted", string.Format("To you at your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.User);
                        AddToQueue(queues, emailQueue2);
                    }

                }

                if (ap.SecondaryUser != null)
                {
                    if (IsMailRequested(preference, ap.StatusCode, approval != null ? approval.StatusCode : null, EventCode.Arrival))
                    {
                        var extraInfo = string.Empty;
                        if (preference.ShowAccountInEmail && ap.StatusCode.Id == OrderStatusCode.Codes.AccountManager)
                        {
                            extraInfo = string.Format(" with accounts {0}", order.AccountNumbers);
                        }
                        //var emailQueue = new EmailQueue(order, preference.NotificationType, string.Format(!assigned ? ArrivalMessage : RerouteMessage, GenerateLink(_serverLink.Address, order.OrderRequestNumber()), order.Vendor == null ? "Unspecified Vendor" : order.Vendor.Name, ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                        if (!assigned)
                        {
                            var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Arrived", string.Format("At your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                            AddToQueue(queues, emailQueue2);
                        }
                        else
                        {
                            var emailQueue2 = new EmailQueueV2(order, preference.NotificationType, "Rerouted", string.Format("To you at your level ({0}) for review from {1}{2}.", ap.StatusCode.Name, currentUser.FullName, extraInfo), ap.SecondaryUser);
                            AddToQueue(queues, emailQueue2);
                        }
                    }
                }
            }
        }