private void TransferFormValuesTo(SupportTicket supportTicketToSave, SupportTicketFormDto supportTicketFormDto) {
            // Note the WhenResolved time if going from not-resolved to resolved
            if (supportTicketToSave.Status != StatusType.Resolved && supportTicketFormDto.Status == StatusType.Resolved)
                supportTicketToSave.WhenResolved = DateTime.UtcNow;

            supportTicketToSave.IssueDescription = supportTicketFormDto.IssueDescription;
            supportTicketToSave.Resolution = supportTicketFormDto.Resolution;
            supportTicketToSave.Status = supportTicketFormDto.Status;
            supportTicketToSave.Customer = supportTicketFormDto.Customer;
            supportTicketToSave.IssueType = supportTicketFormDto.IssueType;
        }
        private SupportTicket CreateNewSupportTicket(SupportTicketFormDto supportTicketFormDto) {
            var supportTicketToSave = new SupportTicket {
                OpenedBy = _contextRegistry.GetLoggedInStaffMember(),
                WhenOpened = DateTime.UtcNow
            };

            supportTicketToSave.WhenResolved = supportTicketFormDto.Status == StatusType.Resolved
                ? supportTicketToSave.WhenOpened
                : new DateTime?();

            return supportTicketToSave;
        }
        public OpenSupportTicketViewModel CreateOpenSupportTicketViewModel(SupportTicketFormDto supportTicketFormDto) {
            var statusTypes =
                from StatusType statusType in Enum.GetValues(typeof(StatusType))
                select new Pair<int, string>((int) statusType, EnumUtils.GetEnumDescription(statusType));
            
            var viewModel = new OpenSupportTicketViewModel {
                SupportTicketFormDto = supportTicketFormDto,
                IssueTypes = _issueTypeRepository.GetAll()
                    .OrderBy(x => x.Name),
                LoggedInStaffMember = _contextRegistry.GetLoggedInStaffMember(),
                StatusTypes = statusTypes
            };

            return viewModel;
        }
        public ActionResult Edit(SupportTicketFormDto supportTicketFormDto) {
            if (ModelState.IsValid) {
                ActionConfirmation<SupportTicket> confirmation =
                    _openSupportTicketTasks.Open(supportTicketFormDto);

                if (confirmation.WasSuccessful) {
                    TempData["message"] = confirmation.Message;
                    return RedirectToAction("Index");
                }

                ViewData["message"] = confirmation.Message;
            }

            return View(_openSupportTicketTasks.CreateOpenSupportTicketViewModel(supportTicketFormDto));
        }
        public ActionConfirmation<SupportTicket> Open(SupportTicketFormDto supportTicketFormDto) {
            if (supportTicketFormDto == null) throw new ArgumentNullException("supportTicketFormDto is null");
            if (!DataAnnotationsValidator.TryValidate(supportTicketFormDto))
                throw new InvalidOperationException("supportTicketFormDto is in an invalid state");

            var supportTicketToSave = supportTicketFormDto.Id > 0
                ? _supportTicketRepository.Get(supportTicketFormDto.Id)
                : CreateNewSupportTicket(supportTicketFormDto);

            TransferFormValuesTo(supportTicketToSave, supportTicketFormDto);

            var customerConfirmationMessage = HandleNewCustomer(supportTicketFormDto.NewCustomer, supportTicketToSave);
            var issueConfirmationMessage = HandleNewIssueType(supportTicketFormDto.NewIssueType, supportTicketToSave);
            _supportTicketRepository.SaveOrUpdate(supportTicketToSave);

            return ActionConfirmation<SupportTicket>
                .CreateSuccessConfirmation("Support ticket #" + supportTicketToSave.Id + " has been opened." +
                    customerConfirmationMessage + issueConfirmationMessage, supportTicketToSave);
        }
 public OpenSupportTicketViewModel() {
     SupportTicketFormDto = new SupportTicketFormDto();
 }