public ActionResult Create(TicketCreateModel model)
        {
            var contactId = this.GetContactId();

            using (var dc = new IORunEntities())
            {
                var contact = dc.Contacts.Single(c => c.Contact_GUID == contactId);
                var company = dc.Kunders.Single(k => k.Kunde_GUID == contact.Contact_CompanyGUID);

                var systemArbejdeTaskLog = TaskTypeRepository.GetHelpdeskTaskType(dc);
                var invoiceType = KundeRepository.FindStandardFakturaType(company);
                var helpdeskUser = TaskRepository.GetHelpdeskUser(dc);

                var newTask = TaskRepository.CreateTask(
                    company.Kunde_GUID,
                    contactId,
                    model.Overskrift,
                    model.Beskrivelse,
                    dc,
                    invoiceType,
                    systemArbejdeTaskLog,
                    helpdeskUser.Bruger_GUID,
                    contactId);

                newTask.Task_WebCreated = 1;
                newTask.Task_WebVisible = 1;

                dc.Tasks.Add(newTask);

                dc.SaveChanges();

                // Laver ged i rapportering
                //var newTaskLog = TaskRepository.CreateTaskLog(newTask.Task_GUID, dc, null, contactId);
                //newTaskLog.TaskLog_WebVisible = 1;
                //newTaskLog.TaskLog_InternalText = model.Beskrivelse;
                //newTaskLog.TaskLog_ExternalText = model.Beskrivelse;

                //dc.TaskLogs.Add(newTaskLog);

                var newMail = MailRepository.CreateTicketOprettetMail(contact, model.Overskrift, newTask.Task_IssueIdentifier, Properties.Settings.Default.SiteRootUrl);

                dc.EmailQueues.Add(newMail);

                dc.SaveChanges();

                return RedirectToAction("Edit", new { id = newTask.Task_IssueIdentifier });
            }
        }
        public void Execute(IJobExecutionContext context)
        {
            log.Info("Kører check new tasklogs job");

            try
            {
                var service = SendEmailJob.GetExchangeService(
                     Properties.Settings.Default.SupportEmailAddress,
                     Properties.Settings.Default.SupportEmailUsername,
                     Properties.Settings.Default.SupportEmailPassword,
                     ExchangeVersion.Exchange2010,
                     _serviceUri);

                _serviceUri = service.Url;

                using (var dc = new IORunEntities())
                {
                    var synligeTasksOprettetEllerOpdateretIdag = dc.Tasks.Where(tl =>
                        (
                            tl.Task_NewestTasklogDate.HasValue &&
                            tl.Task_NewestTasklogDate >= DateTime.Today
                        ) &&
                        tl.IsThrash == 0 &&
                        tl.Task_WebVisible == 1).ToList();

                    log.Info($"Checker for nye urapporterede tasklogs på {synligeTasksOprettetEllerOpdateretIdag.Count} tasks");

                    foreach (var thisTask in synligeTasksOprettetEllerOpdateretIdag)
                    {
                        try
                        {
                            CheckTask(thisTask, dc);
                        }
                        catch (Exception checkTaskExcepException)
                        {
                            log.Error("Check task failed", checkTaskExcepException);
                        }
                    }

                    dc.SaveChanges();
                }
            }
            catch (Exception e)
            {
                log.Error(e);
            }

            log.Info("Færdig med check for tasklogs job");
        }
        public ActionResult Index(ProfileEditModel model)
        {
            var contactId = this.GetContactId();
            var valid = true;

            ModelState.Clear();

            using (var dc = new IORunEntities())
            {
                var contact = dc.Contacts.Single(c => c.Contact_GUID == contactId);

                contact.Contact_Work_EMail = model.EmailAdresse;
                contact.Contact_Work_MobileNumber = model.Mobile;

                if (string.IsNullOrEmpty(model.Kodeord) == false)
                {
                    if (string.Equals(model.Kodeord, model.NytKodeordBekraeft))
                    {
                        contact.Contact_PWD = model.Kodeord;

                        model.ErrorMessage = "Passwordet er ændret";
                        model.Kodeord = "";
                        model.NytKodeordBekraeft = "";
                    }
                    else
                    {
                        model.ErrorMessage = "De to passwords skal være ens";
                        valid = true;
                    }
                }
                else
                {
                    model.ErrorMessage = "Ændringer gemt";
                }

                if (valid)
                {
                    dc.SaveChanges();
                }

                return View(model);
            }
        }
        public void Execute(IJobExecutionContext context)
        {
            log.Info("Kører check support inbox job");

            try
            {
                var service = SendEmailJob.GetExchangeService(
                 Properties.Settings.Default.SupportEmailAddress,
                 Properties.Settings.Default.SupportEmailUsername,
                 Properties.Settings.Default.SupportEmailPassword,
                    ExchangeVersion.Exchange2010,
                    _serviceUri);

                _serviceUri = service.Url;

                var inboxFolder = new FolderId(WellKnownFolderName.Inbox, new Mailbox(Properties.Settings.Default.SupportEmailAddress));

                var mailIds = GetMailIdsToProcess(service, inboxFolder);

                if (mailIds.Any())
                {
                    using (var dc = new IORunEntities())
                    {
                        log.Info($"Checker {mailIds.Count} mails");

                        foreach (var mailInfo in mailIds)
                        {
                            if (_alreadySpottedEmails.Contains(mailInfo.ItemId) == false)
                            {
                                var spottedSupportEmail =
                                    dc.SupportEmailReceives.SingleOrDefault(er => er.ExchangeItemId == mailInfo.ItemId);

                                if (spottedSupportEmail == null)
                                {
                                    var propertySet = new PropertySet(
                                        BasePropertySet.IdOnly,
                                        ItemSchema.Subject,
                                        EmailMessageSchema.From,
                                        ItemSchema.Body,
                                        ItemSchema.DateTimeReceived);
                                    propertySet.RequestedBodyType = BodyType.Text;

                                    var exchangeMail = Microsoft.Exchange.WebServices.Data.EmailMessage.Bind(
                                        service,
                                        new ItemId(mailInfo.ItemId),
                                        propertySet);

                                    ProcessReceivedSupportEmail(dc, exchangeMail);

                                    dc.SupportEmailReceives.Add(new SupportEmailReceive()
                                    {
                                        ExchangeItemId = mailInfo.ItemId,
                                        Subject = mailInfo.Subject,
                                        SpottedAt = DateTime.Now
                                    });

                                    _alreadySpottedEmails.Add(mailInfo.ItemId);

                                    log.Info($"Modtaget support email '{mailInfo.Subject}'");
                                }
                                else
                                {
                                    _alreadySpottedEmails.Add(mailInfo.ItemId);
                                }
                            }
                        }

                        dc.SaveChanges();
                    }
                }
            }
            catch (Exception e)
            {
                log.Error(e);
            }

            log.Info("Færdig med inbox check job");
        }
        private void ProcessReceivedSupportEmail(IORunEntities dc, EmailMessage exchangeMail)
        {
            log.Info($"Processerer {exchangeMail.Subject}");

            var senderEmail = exchangeMail.From.Address;

            if (senderEmail.Contains("@"))
            {
                var contactsWithMatchingEmail = FindContactWithMatchingEmail(dc, senderEmail);

                if (contactsWithMatchingEmail.Count == 1)
                {
                    var contact = contactsWithMatchingEmail.Single();
                    var company = dc.Kunders.Single(k => k.Kunde_GUID == contact.Contact_CompanyGUID.Value);

                    var ticketNumber = FindTicketNumber(exchangeMail);

                    if (ticketNumber > 0)
                    {
                        log.Info($"Ticket nummer fundet: {ticketNumber}");

                        var ticketTask = dc.Tasks.SingleOrDefault(t => t.Task_IssueIdentifier == ticketNumber);
                        if (ticketTask != null)
                        {
                            if (ticketTask.Task_CompanyGUID == contact.Contact_CompanyGUID.Value)
                            {
                                LogSupport(dc, ticketTask, contact, exchangeMail, ticketNumber);
                            }
                            else
                            {
                                log.Warn($"Ticket tilhører ikke  kontakt persons kunde: {ticketNumber}");
                            }
                        }
                        else
                        {
                            log.Warn($"Ingen task med ticket nummer fundet: {ticketNumber}");
                        }
                    }
                    else
                    {
                        var systemArbejdeTaskType = TaskTypeRepository.GetHelpdeskTaskType(dc);
                        var invoiceType = KundeRepository.FindStandardFakturaType(company);
                        var helpdeskUser = TaskRepository.GetHelpdeskUser(dc);

                        var nyTicketTask = TaskRepository.CreateTask(
                            contact.Contact_CompanyGUID.Value,
                            contact.Contact_GUID,
                            exchangeMail.Subject,
                            exchangeMail.Body.Text,
                            dc,
                            invoiceType,
                            systemArbejdeTaskType,
                            helpdeskUser.Bruger_GUID,
                            contact.Contact_GUID);
                        nyTicketTask.Task_WebVisible = 1;
                        nyTicketTask.Task_WebCreated = 1;
                        nyTicketTask.Task_Description = exchangeMail.Body.Text.Truncate(512);

                        dc.Tasks.Add(nyTicketTask);

                        dc.SaveChanges();

                        ticketNumber = nyTicketTask.Task_IssueIdentifier;

                        var newTaskLog= LogSupport(dc, nyTicketTask, contact, exchangeMail, ticketNumber);

                        var newMailForTicketCreated = MailRepository.CreateTicketOprettetMail(contact, exchangeMail.Subject, ticketNumber, Properties.Settings.Default.SiteRootUrl);

                        dc.EmailQueues.Add(newMailForTicketCreated);

                        dc.SaveChanges();

                        // Registrer at der allerede er sendt en ticket oprettet mail, ellers
                        // kommer der både oprettet og opdateret mails
                        dc.TasklogChangeReporteds.Add(new TasklogChangeReported() { TaskId = nyTicketTask.Task_GUID, NewestChange = DateTime.Now.AddMinutes(5), TasklogId = newTaskLog.TaskLog_GUID});

                        log.Info($"Ny ticket oprettet med nummer {nyTicketTask.Task_IssueIdentifier}");
                    }
                }
                else
                {
                    log.InfoFormat($"Ukendt email adresse, eller flere muligheder: {senderEmail} Count: {contactsWithMatchingEmail.Count}");
                }
            }
            else
            {
                log.InfoFormat($"Ikke en email adresse: {senderEmail}");
            }
        }
        public void Execute(IJobExecutionContext context)
        {
            log.Info("Kører send emails job");

            try
            {
                var service = GetExchangeService(
                 Properties.Settings.Default.SupportEmailAddress,
                 Properties.Settings.Default.SupportEmailUsername,
                 Properties.Settings.Default.SupportEmailPassword,
                     ExchangeVersion.Exchange2010,
                     _serviceUri);

                _serviceUri = service.Url;

                using (var dc = new IORunEntities())
                {
                    var emailsToSend = dc.EmailQueues.Where(eq => eq.SendFailed == false);

                    log.Info($"Fandt {emailsToSend.Count()} emails der skal sendes");

                    foreach (var thisEmailToSend in emailsToSend)
                    {
                        try
                        {
                            SendMail(service, new MailWrapper()
                            {
                                BodyText = thisEmailToSend.BodyText,
                                FromDisplayName = thisEmailToSend.FromName,
                                FromEmail = thisEmailToSend.FromEmailAddress,
                                Subject = thisEmailToSend.Subject,
                                ToDisplayName = thisEmailToSend.ToName,
                                ToEmail = thisEmailToSend.ToEmailAddress
                            });

                            dc.EmailQueues.Remove(thisEmailToSend);
                        }
                        catch (Exception e)
                        {
                            thisEmailToSend.SendFailed = true;
                            thisEmailToSend.SendAttempted = DateTime.Now;
                            thisEmailToSend.SendError = e.ToString();
                        }
                    }

                    dc.SaveChanges();
                }
            }
            catch (Exception e)
            {
                log.Error(e);
            }

            log.Info("Færdig med send emails job");
        }
        public ActionResult Edit(TicketEditModel model)
        {
            var contactId = this.GetContactId();

            using (var dc = new IORunEntities())
            {
                var contact = dc.Contacts.Single(c => c.Contact_GUID == contactId);
                var task = dc.Tasks.Single(t => t.Task_GUID == model.TaskId);

                if (task.Task_CompanyGUID != contact.Contact_CompanyGUID)
                    throw new SecurityException("Unauthorized");

                var newTaskLog = TaskRepository.CreateTaskLog(task.Task_GUID, dc, null, contactId);
                newTaskLog.TaskLog_WebVisible = 1;
                newTaskLog.TaskLog_InternalText = model.NewMessage;
                newTaskLog.TaskLog_ExternalText = model.NewMessage;

                dc.TaskLogs.Add(newTaskLog);

                task.Task_UpdatedByContactGUID = contactId;
                task.Task_UpdatedByContactDate = DateTime.Now;

                dc.SaveChanges();

                var newModel = BuildEditModel(task.Task_IssueIdentifier);

                return View(newModel);
            }
        }