private static Email ComposeDynamicEmail(EmailInformation emailInfo, object newEmailObject)
        {
            dynamic email = null;

            if (newEmailObject.GetType() == typeof(InvitationEmail))
            {
                email = ComposeEmail(emailInfo, "Invitation");

                //Attach a file
                AddAttachAttachment(email, emailInfo);
            }
            else if (newEmailObject.GetType() == typeof(EmailInfoChangeEmail))
            {
                //write changed Info email
                email = ComposeEmail(emailInfo, "EmailInfoChange");

                //Attach a file
                AddAttachAttachment(email, emailInfo);
            }
            else if (newEmailObject.GetType() == typeof(CancellationEmail))
            {
                //Write Cancellation Email
                email = ComposeEmail(emailInfo, "Cancellation");
            }

            return email;
        }
        private static Email ComposeDynamicEmail(EmailInformation emailInfo, object newEmailObject)
        {
            dynamic email = null;

            if (newEmailObject.GetType() == typeof(InvitationEmail))
            {
                email = ComposeEmail(emailInfo, "Invitation");

                //Attach a file
                AddAttachAttachment(email, emailInfo);
            }
            else if (newEmailObject.GetType() == typeof(EmailInfoChangeEmail))
            {
                //write changed Info email
                email = ComposeEmail(emailInfo, "EmailInfoChange");

                //Attach a file
                AddAttachAttachment(email, emailInfo);
            }
            else if (newEmailObject.GetType() == typeof(CancellationEmail))
            {
                //Write Cancellation Email
                email = ComposeEmail(emailInfo, "Cancellation");
            }

            return(email);
        }
        public static void ScheduleParticipantListEmail(EmailInformation emailInfo, DateTime listDate)
        {
            const string jobDescription = "Send list";
            var currentEvent = emailInfo.CurrentEvent;

            RemoveOldListJob(currentEvent, jobDescription);

            var listJobId = BackgroundJob.Schedule(() => PostalEmailManager.SendListEmail(emailInfo, new ParticipantListEmail()), listDate);
            AddJobsIntoEvent(listJobId, currentEvent.Id, jobDescription);
        }
        private static Event GetCurrentEvent(EmailInformation emailInfo)
        {
            Event currentEvent = null;

            try
            {
                currentEvent = Db.Events.Where(e => e.Id == emailInfo.CurrentEvent.Id)
                               .Include(e => e.Participants)
                               .FirstOrDefault();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Error(new Exception(exception.Message)));
            }

            return(currentEvent);
        }
        public static void SendListEmail(EmailInformation emailInfo, object emailObject)
        {
            var currentEvent = GetCurrentEvent(emailInfo);

            if (currentEvent == null)
            {
                //using Error log Class
                const string errorMessage = "Event returned null, no list of participants have been sent to the Organizer";
                ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Error(new Exception(errorMessage)));

                return;
            }

            var participants = currentEvent.Participants.ToList();

            var allParticipant          = participants.Count();
            var respondedParticipants   = participants.Count(p => p.Responce);
            var attendingParticipant    = participants.Count(p => p.Availability);
            var notAttendingParticipant = allParticipant - attendingParticipant;

            dynamic email = new Email("ParticipantList");

            email.To = emailInfo.OrganizerEmail;

            //ToDo:change the email of the sender
            email.From         = "*****@*****.**";
            email.EmailSubject = "Participants summary" + " " + emailInfo.CurrentEvent.Title;

            email.EventTitle = emailInfo.CurrentEvent.Title;

            email.OrganizerName = emailInfo.OrganizerName;

            email.AllParticipants         = allParticipant;
            email.ParticipantAttending    = attendingParticipant;
            email.ParticipantNotAttending = notAttendingParticipant;
            email.ParticipantsResponded   = respondedParticipants;
            email.EventDetailsUrl         = emailInfo.EventDetailsUrl;
            email.attendindParticipants   = participants.Where(p => p.Availability);

            SendCorespondingEmail(email);
        }
        private static dynamic ComposeEmail(EmailInformation emailInfo, string emailView)
        {
            dynamic email = new Email(emailView);

            email.To      = emailInfo.ParticipantEmail;
            email.From    = emailInfo.OrganizerEmail;
            email.Subject = emailInfo.CurrentEvent.Title + emailInfo.EmailSubject;

            email.EventTitle    = emailInfo.CurrentEvent.Title;
            email.EventLocation = emailInfo.CurrentEvent.Location;
            email.EventsId      = emailInfo.CurrentEvent.Id;

            email.StartDate   = emailInfo.CurrentEvent.StartDate.GetValueOrDefault();
            email.GetListDate = emailInfo.CurrentEvent.ListDate.GetValueOrDefault();

            email.ParticipantId = emailInfo.ParticipantId;
            email.OrganizerName = emailInfo.OrganizerName;

            email.ResponseUrl = emailInfo.ResponseUrl;

            email.EventDetailsUrl = emailInfo.EventDetailsUrl;
            return(email);
        }
Exemplo n.º 7
0
        public Attachment CreateAttachment(EmailInformation emailInformation)
        {
            var eventToSend = emailInformation.CurrentEvent;

            var startDate = eventToSend.StartDate.GetValueOrDefault().ToUniversalTime();
            var endDate = startDate.Add(TimeSpan.FromHours(4));

            //Build attachment
            var stringBuilder = new StringBuilder();
            stringBuilder.AppendLine("BEGIN:VCALENDAR");
            stringBuilder.AppendLine("PRODID:-//Invitation");
            stringBuilder.AppendLine("VERSION:2.0");
            stringBuilder.AppendLine("METHOD:REQUEST");

            stringBuilder.AppendLine("BEGIN:VEVENT");
            stringBuilder.AppendLine("SUMMARY;LANGUAGE=en-us:" + eventToSend.Title);
            stringBuilder.AppendLine(String.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", startDate));     //Verify if the time is local time
            stringBuilder.AppendLine(String.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));
            stringBuilder.AppendLine(String.Format("DTEND:{0:yyyyMMddTHHmmssZ}", endDate));
            stringBuilder.AppendLine(String.Format("LOCATION: {0}", eventToSend.Location));
            stringBuilder.AppendLine(String.Format("UID:{0}", Guid.NewGuid()));
            stringBuilder.AppendLine(String.Format("DESCRIPTION:{0}", eventToSend.Description));
            stringBuilder.AppendLine(String.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", eventToSend.Title));
            stringBuilder.AppendLine(String.Format("SUMMARY:{0}", eventToSend.Title));
            stringBuilder.AppendLine(String.Format("ORGANIZER:MAILTO:{0}", emailInformation.OrganizerEmail));
            //stringBuilder.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", email.SenderLastName, email.From));
            stringBuilder.AppendLine("BEGIN:VALARM");
            stringBuilder.AppendLine("TRIGGER:-PT15M");
            stringBuilder.AppendLine("ACTION:DISPLAY");
            stringBuilder.AppendLine("DESCRIPTION:Reminder");
            stringBuilder.AppendLine("END:VALARM");
            stringBuilder.AppendLine("END:VEVENT");
            stringBuilder.AppendLine("END:VCALENDAR");

            //store it in Memory stream
            var bytes = Encoding.ASCII.GetBytes(stringBuilder.ToString());
            MemoryStream stream = null;

            using (stream)
            {
                stream = new MemoryStream(bytes);
            }

            var contentType = new ContentType("text/calender");
            // ReSharper disable once PossibleNullReferenceException
            contentType.Parameters.Add("method", "REQUEST");
            contentType.Parameters.Add("name", String.Format("{0}'s_Invitation.ics", eventToSend.Title));

            //create attachment
            var attachment = new Attachment(stream, contentType);

            //return Attachment
            return attachment;

        }
        public static void SendListEmail(EmailInformation emailInfo, object emailObject)
        {
            var currentEvent = GetCurrentEvent(emailInfo);

            if (currentEvent == null)
            {
                //using Error log Class
                const string errorMessage = "Event returned null, no list of participants have been sent to the Organizer";
                ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Error(new Exception(errorMessage)));

                return;
            }

            var participants = currentEvent.Participants.ToList();

            var allParticipant = participants.Count();
            var respondedParticipants = participants.Count(p => p.Response);
            var numberOfAttendingParticipant = participants.Count(p => p.Availability);
            var notAttendingParticipant = allParticipant - numberOfAttendingParticipant;

            dynamic email = new Email("ParticipantList");

            email.To = emailInfo.ParticipantEmail;
            email.From = "*****@*****.**";
            email.EmailSubject = "Participants summary" + " " + emailInfo.CurrentEvent.Title;

            email.EventTitle = emailInfo.CurrentEvent.Title;

            email.OrganizerName = emailInfo.OrganizerName;

            email.AllParticipants = allParticipant;
            email.ParticipantAttending = numberOfAttendingParticipant;
            email.ParticipantNotAttending = notAttendingParticipant;
            email.ParticipantsResponded = respondedParticipants;
            email.EventDetailsUrl = emailInfo.EventDetailsUrl;
            email.attendindParticipants = participants.Where(p=>p.Availability);

            SendCorespondingEmail(email);
        }
 private static void AddAttachAttachment(dynamic email, EmailInformation emailInfo)
 {
     var emailAttachment = _service.CreateAttachment(emailInfo);
     email.Attach(emailAttachment);
 }
        public static void SendEmail(EmailInformation emailInfo, object newEmailObject)
        {
            var email = ComposeDynamicEmail(emailInfo, newEmailObject);

            SendCorespondingEmail(email);
        }
        private static dynamic ComposeEmail(EmailInformation emailInfo, string emailView)
        {

            dynamic email = new Email(emailView);

            email.To = emailInfo.ParticipantEmail;
            email.From = "*****@*****.**";
            email.Subject = emailInfo.CurrentEvent.Title + emailInfo.EmailSubject;

            email.EventTitle = emailInfo.CurrentEvent.Title;
            email.EventLocation = emailInfo.CurrentEvent.Location;
            email.EventsId = emailInfo.CurrentEvent.Id;

            email.StartDate = emailInfo.CurrentEvent.StartDate.GetValueOrDefault();
            email.GetListDate = emailInfo.CurrentEvent.ListDate.GetValueOrDefault();

            email.ParticipantId = emailInfo.ParticipantId;
            email.OrganizerName = emailInfo.OrganizerName;

            email.ResponseUrl = emailInfo.ResponseUrl;

            email.EventDetailsUrl = emailInfo.EventDetailsUrl;
            return email;
        }
        private static Event GetCurrentEvent(EmailInformation emailInfo)
        {
            Event currentEvent = null;
            try
            {
                currentEvent = Db.Events.Where(e => e.Id == emailInfo.CurrentEvent.Id)
                    .Include(e => e.Participants)
                    .FirstOrDefault();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                ErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Error(new Exception(exception.Message)));
            }

            return currentEvent;
        }
        private static void AddAttachAttachment(dynamic email, EmailInformation emailInfo)
        {
            var emailAttachment = _service.CreateAttachment(emailInfo);

            email.Attach(emailAttachment);
        }
        public static void SendEmail(EmailInformation emailInfo, object newEmailObject)
        {
            var email = ComposeDynamicEmail(emailInfo, newEmailObject);

            SendCorespondingEmail(email);
        }
        public ActionResult DeleteConfirmed(int id)
        {
            var user = _service.GetUser();
            var @event = _db.Events.Include(ev => ev.Participants)
                                          .FirstOrDefault(e => (e.Id == id) && (e.SchedulerUserId == UserId));


            //if event hasn't occured notify users of cancellation
            if (_service.EventHasNotPassed(@event))
            {
                var currentEvent = _db.Events.Where(e => e.Id == @event.Id)
                                    .Include(e => e.Participants).FirstOrDefault();

                if (currentEvent == null)
                {
                    return View("error");
                }
                var participants = currentEvent.Participants.ToList();


                foreach (var participant in participants)
                {
                    var emailInfo = new EmailInformation
                                                 {
                                                     CurrentEvent = @event,
                                                     OrganizerEmail = user.UserName,
                                                     OrganizerName = user.FirstName,
                                                     EmailSubject = " cancellation",
                                                     ParticipantEmail = participant.Email,
                                                     ParticipantId = participant.Id
                                                 };
                    PostalEmailManager.SendEmail(emailInfo, new CancellationEmail());
                }

                //Remove Scheduled emails for deleted Event
                JobManager.RemoveScheduledJobs(currentEvent);
            }

            _db.Events.Remove(@event);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        public ActionResult Edit([Bind(Include = "Id,Title,Location,Description,StartDate,EndDate,ReminderDate,ListDate,SchedulerUserId")] 
            Event eventToEdit, int? id)
        {
            var results = eventToEdit.StartDate.GetValueOrDefault().CompareTo(eventToEdit.ListDate.GetValueOrDefault());

            if (results < 0)
            {
                ModelState.AddModelError("dateError", "Enter date before Starting date");
            }

            if (!ModelState.IsValid)
            {
                return View(eventToEdit);
            }

            _db.Entry(eventToEdit).State = EntityState.Modified;
            _db.SaveChanges();

            var remanderDate = Service.GetRemanderDate(eventToEdit);
            var listDate = Service.GetListDate(eventToEdit);

            //Remove scheduled jobs of this event
            JobManager.RemoveScheduledJobs(eventToEdit);

            #region Send update emails to participants
            //Get Participants
            var currentEvent = _db.Events
                                  .Where(e => e.Id == eventToEdit.Id)
                                  .Include(e => e.Participants)
                                  .FirstOrDefault();

            if (currentEvent == null)
            {
                return View("Error");
            }

            var participants = currentEvent.Participants.ToList();

            var user = _service.GetUser();

            EmailInformation emailInfo = null;
            var emails = new List<EmailInformation>();

            //There is no participants
            if (participants.Count == 0)
            {
                return RedirectToAction("Index");
            }

            foreach (var participant in participants)
            {
                var participantId = participant.Id;
                var detailsUrl = Url.Action("Details", "Response",
                    new RouteValueDictionary(new { id = currentEvent.Id }), "https");
                var responseUrl = Url.Action("Response", "Response",
                    new RouteValueDictionary(new { id = currentEvent.Id, pId = participantId }), "https");

                emailInfo = new EmailInformation
                            {
                                CurrentEvent = currentEvent,
                                OrganizerName = user.FirstName + " " + user.LastName,
                                OrganizerEmail = user.UserName,
                                ParticipantId = participantId,
                                ParticipantEmail = participant.Email,
                                EmailSubject = " changes.",
                                ResponseUrl = responseUrl,
                                EventDetailsUrl = detailsUrl
                            };

                emails.Add(emailInfo);

                //Notify Participant using postal
                PostalEmailManager.SendEmail(emailInfo, new EmailInfoChangeEmail());
            }
            #endregion


            //Schedule remainders only when there is a remainder date
            if (eventToEdit.ReminderDate != null)
            {
                JobManager.ScheduleRemainderEmail(emails, (DateTime)remanderDate);
            }
            //Schedule new emails for edited Job
            JobManager.ScheduleParticipantListEmail(emailInfo, listDate);
            //JobManager.AddJobsIntoEvent(eventToEdit.Id,"Send List");

            return RedirectToAction("Index");
        }