public async Task <ActionResult> EditProcedure(ProcedureEditModel model)
        {
            if (!ModelState.IsValid)
            {
                ViewBag.Error = CreateError();
                return(View("Error"));
            }
            try
            {
                var procedureDto = Mapper.Map <ProcedureEditModel, ProcedureDTO>(model);
                await SenEmailAboutUpdateProcedure(model);

                _procedureService.Update(procedureDto);
                _procedureService.Commit();
                _currentUser        = GetCurrentUser();
                TempData["Success"] = Resources.Messages.ProcedureUpdatedSuccess;
                Logger.Log.Info($"{_currentUser.Email} Edited Procedure #{model.Id} for Product #{model.ProductId} ");

                return(RedirectToAction("ProductProcedures", new { id = model.ProductId }));
            }
            catch (Exception ex)
            {
                @ViewBag.Error = ex.ToString();
                return(View("Error"));
            }
        }
        public async Task <string> CreateBodyText(ProcedureEditModel model)
        {
            var bodyStr = new StringBuilder();

            var oldProcedure = _procedureService.GetItem(model.Id);

            if (oldProcedure.ApprovalDate != model.ApprovalDate)
            {
                bodyStr.Append($"<strong>{Resources.Labels.ApprovalDate}</strong> changed to {model.ApprovalDate.ToString().Substring(0, 10)}<br>");
            }
            if (oldProcedure.EstimatedApprovalDate != model.ApprovalDate)
            {
                bodyStr.Append($"<strong>{Resources.Labels.EstimatedApprovalDate}</strong> changed to {model.EstimatedApprovalDate.ToString(CultureInfo.InvariantCulture).Substring(0, 10)}<br>");
            }
            if (oldProcedure.SubmissionDate != model.SubmissionDate)
            {
                bodyStr.Append($"<strong>{Resources.Labels.SubmissionDate}</strong> changed to {model.SubmissionDate.ToString(CultureInfo.InvariantCulture).Substring(0, 10)}<br>");
            }

            if (oldProcedure.Comments != model.Comments)
            {
                bodyStr.Append($"<strong>Comments</strong> changed to {model.Comments}<br>");
            }

            if (model.ProcedureDocuments != null && model.ProcedureDocuments.Count > 0)
            {
                foreach (var doc in model.ProcedureDocuments)
                {
                    var newDocument = new ProcedureDocument()
                    {
                        PathToDocument = doc.PathToDocument, ProcedureId = doc.ProcedureId, ProcedureDocsType = doc.ProcedureDocsType
                    };
                    var res  = oldProcedure.ProcedureDocuments.FirstOrDefault(a => a.PathToDocument == doc.PathToDocument && a.ProcedureId == doc.ProcedureId && a.ProcedureDocsType == doc.ProcedureDocsType);
                    var res2 = oldProcedure.ProcedureDocuments.Contains(newDocument);
                    if (res == null && !res2)
                    {
                        bodyStr.Append($"<strong>To {doc.ProcedureDocsType} added document:</strong> {doc.PathToDocument}<br>");
                    }
                }
            }
            return(bodyStr.ToString());
        }
        public async Task SenEmailAboutUpdateProcedure(ProcedureEditModel model)
        {
            try
            {
                var prod = _productService.GetProduct((int)model.ProductId);
                if (prod == null)
                {
                    Logger.Log.Error($"{Resources.ErrorMessages.EmailNotSendCantFindProdToProc} ProcedureId={model.Id}");
                    return;
                }

                var product            = Mapper.Map <ProductDTO, ShowProductModel>(prod);
                var productName        = product.ProductName;
                var userEmailsToNotify = _countryService.GetCountryUsersEmailsViaName(product.Country);

                var body = new StringBuilder();

                var subject = Resources.Email.SubjectProcedureUpdate.Replace("(name)", productName) + $" in {product.Country}";
                body.Append(Resources.Email.BodyProcedureUpdate.Replace("(name)", productName) + $" in {product.Country}");
                body.Append($" {model.ProcedureType}");
                var bodyCompared = await CreateBodyText(model);

                if (!string.IsNullOrEmpty(bodyCompared))
                {
                    body.Append(":<br>");
                    body.Append(bodyCompared);
                    body.Append(Resources.Email.Signature);
                    var emailerDto = Mapper.Map <Emailer, EmailerDTO>(emailer);
                    if (model.SubmissionDate >= DateTime.Parse("2018-11-11 00:00:00"))
                    {
                        await _emailService.SendEmailNotification(body.ToString(), subject, emailerDto, userEmailsToNotify, toSend);
                    }
                }
            }
            catch (Exception ex)
            {
                var userName = User.Identity.Name;
                Logger.Log.Error($"{userName}: SenEmailAboutAddUpdateProduct() {ex.Message} ");
            }
        }