private void UpdateTargets(DiscountCode discountCode, DiscountCodeEdit discountCodeEdit)
        {
            if (discountCode.Tours == null)
            {
                discountCode.Tours = new List <Tour>();
            }
            discountCode.Tours.Clear();
            if (!discountCode.IsGlobal && discountCodeEdit.TourId != null)
            {
                discountCode.Tours =
                    discountCodeEdit.TourId.Select(i => _tourQueryService.FindTour(Convert.ToInt32(i))).ToList();
            }

            if (discountCode.Products == null)
            {
                discountCode.Products = new List <Product>();
            }
            discountCode.Products.Clear();
            if (!discountCode.IsGlobal && discountCodeEdit.ProductId != null)
            {
                discountCode.Products =
                    discountCodeEdit.ProductId.Select(i => _productQueryService.FindProduct(Convert.ToInt32(i))).ToList();
            }

            if (discountCode.ProductVariants == null)
            {
                discountCode.ProductVariants = new List <ProductVariant>();
            }
            discountCode.ProductVariants.Clear();
            if (!discountCode.IsGlobal && discountCodeEdit.ProductVariantId != null)
            {
                discountCode.ProductVariants =
                    discountCodeEdit.ProductVariantId.Select(i => _productQueryService.FindProductVariant(Convert.ToInt32(i))).ToList();
            }
        }
        public ActionResult Create(DiscountCodeEdit discountCodeEdit)
        {
            var discountCode = Mapper.Map <DiscountCode>(discountCodeEdit);

            if (ModelState.IsValid)
            {
                UpdateTargets(discountCode, discountCodeEdit);
                _discountCodeService.Add(discountCode);
                return(RedirectToRoute("admin-discount-codes"));
            }
            return(View(BuildEditModel(discountCodeEdit, discountCode)));
        }
        public ActionResult Edit(DiscountCodeEdit discountCodeEdit)
        {
            var discountCode = _discountCodeService.FindDiscountCode(discountCodeEdit.Id);

            if (!ModelState.IsValid)
            {
                return(View(BuildEditModel(discountCodeEdit, discountCode)));
            }

            Mapper.Map(discountCodeEdit, discountCode);
            UpdateTargets(discountCode, discountCodeEdit);
            _discountCodeService.Update(discountCode);
            return(RedirectToRoute("admin-discount-codes"));
        }
        private DiscountCodeEdit BuildEditModel(DiscountCodeEdit discountCodeEdit, DiscountCode discountCode)
        {
            var tours = _tourQueryService.Tours().ToList();

            discountCodeEdit.TourItems =
                tours.Select(
                    t =>
                    new SelectListItem
            {
                Text  = string.Format("{0} - {1}", t.Code, t.Name),
                Value = t.Id.ToString(CultureInfo.InvariantCulture)
            });

            var firstTour = tours.FirstOrDefault();

            if (firstTour != null && firstTour.Departures.Any())
            {
                discountCodeEdit.ProductItems =
                    firstTour.Departures.Select(d => d.Product)
                    .Select(
                        p =>
                        new SelectListItem
                {
                    Text  = string.Format("{0} - {1}", p.Departure.Code, p.Name),
                    Value = p.Id.ToString(CultureInfo.InvariantCulture)
                });

                var firstProduct = firstTour.Departures.First().Product;
                if (firstProduct != null)
                {
                    discountCodeEdit.ProductVariantItems =
                        firstProduct.ProductVariants.Select(
                            pv => new SelectListItem
                    {
                        Text  = string.Format("{0} - {1}", pv.Product.Departure.Code, pv.DisplayName),
                        Value = pv.Id.ToString(CultureInfo.InvariantCulture)
                    });
                }
            }

            if (discountCode.Tours != null)
            {
                discountCodeEdit.ToursJson =
                    new JavaScriptSerializer().Serialize(
                        discountCode.Tours.Select(
                            t => new { id = t.Id, name = string.Format("{0} - {1}", t.Code, t.Name), targetType = "TourId" }));
            }

            if (discountCode.Products != null)
            {
                discountCodeEdit.ProductsJson =
                    new JavaScriptSerializer().Serialize(
                        discountCode.Products.Select(
                            p =>
                            new { id = p.Id, name = string.Format("{0} - {1}", p.Departure.Code, p.Name), targetType = "ProductId" }));
            }

            if (discountCode.ProductVariants != null)
            {
                discountCodeEdit.ProductVariantsJson =
                    new JavaScriptSerializer().Serialize(
                        discountCode.ProductVariants.Select(
                            v =>
                            new
                {
                    id         = v.Id,
                    name       = string.Format("{0} - {1}", v.Product.Departure.Code, v.DisplayName),
                    targetType = "ProductVariantId"
                }));
            }
            return(discountCodeEdit);
        }