public ActionResult EditSave(PromotionUi model)
 {
     if (model.Id == 0)
     {
         SaveNewPromotion(model);
         SuccessMessage("Промо акция добавлена и отправлен запрос на её подтверждение");
         return(RedirectToAction("Index"));
     }
     else
     {
         ChangePromotion(model);
         SuccessMessage("Промо акция изменена и отправлен запрос на её подтверждение");
         return(RedirectToAction("Index"));
     }
 }
        public void Find(producerinterface_Entities db, Context db2, long producerId)
        {
            var promoList = db2.Promotions.Where(x => x.ProducerId == producerId).OrderByDescending(x => x.Begin)
                            .ThenByDescending(x => x.Id).ToList();
            var suppliers  = db.suppliernames.ToDictionary(x => x.SupplierId, x => x.SupplierName);
            var assortment = db.assortment.Where(x => x.ProducerId == producerId).ToDictionary(x => x.CatalogId, x => x.CatalogName);

            foreach (var item in promoList)
            {
                unchecked {
                    if (item.RegionMask == 0)
                    {
                        item.RegionMask = (long)ulong.MaxValue;
                    }
                }
                var supplierIds = item.PromotionsToSupplier.Select(x => x.SupplierId).ToList();
                var drugsIds    = item.PromotionToDrug.Select(x => x.DrugId).ToList();
                var status      = item.GetStatus();
                if (Status != null && Status != status)
                {
                    continue;
                }
                var itemUi = new PromotionUi()
                {
                    Id                = item.Id,
                    Name              = item.Name,
                    Annotation        = item.Annotation,
                    Begin             = item.Begin.ToString("dd.MM.yyyy"),
                    End               = item.End.ToString("dd.MM.yyyy"),
                    PromotionFileId   = item.MediaFile?.Id,
                    PromotionFileName = item.MediaFile?.ImageName,
                    AllSuppliers      = item.AllSuppliers,
                    ActualStatus      = status,
                    DrugList          = assortment.Where(x => drugsIds.Contains(x.Key)).Select(x => x.Value).ToList(),
                    RegionList        = db.Regions((ulong)item.RegionMask).Select(x => x.Name).ToList(),
                    SuppierRegions    = suppliers.Where(x => supplierIds.Contains(x.Key)).Select(x => x.Value).ToList(),
                    RowStyle          = item.RowStyle
                };
                Items.Add(itemUi);
            }
        }
        private JsonResult ToJson(Promotion model)
        {
            var viewModel = new PromotionUi();

            viewModel.DrugCatalogList = h.GetCatalogList().Select(x => new TextValue {
                Text = x.Text, Value = x.Value
            }).ToList();
            viewModel.RegionGlobalList = DB.Regions().Select(x => new TextValue(x)).ToList();
            viewModel.Id         = model.Id;
            viewModel.Name       = model.Name;
            viewModel.Annotation = model.Annotation;
            if (model.MediaFile != null)
            {
                viewModel.PromotionFileId   = model.MediaFile.Id;
                viewModel.PromotionFileName = model.MediaFile.ImageName;
                viewModel.PromotionFileUrl  = Url.Action("GetFile", "MediaFiles", new { model.MediaFile.Id });
            }

            if (model.Id == 0)
            {
                viewModel.Title = "Новая промоакция";
            }
            else
            {
                viewModel.Title = "Редактирование промоакции: " + model.Name;
            }

            viewModel.PromotionFileId = model.MediaFile?.Id;
            if (model.Begin < DateTime.Now)
            {
                viewModel.Begin = DateTime.Now.ToString("dd.MM.yyyy");
            }
            else
            {
                viewModel.Begin = model.Begin.ToString("dd.MM.yyyy");
            }

            if (model.End < DateTime.Now)
            {
                viewModel.End = DateTime.Now.ToString("dd.MM.yyyy");
            }
            else
            {
                viewModel.End = model.End.ToString("dd.MM.yyyy");
            }

            viewModel.DrugList = model.PromotionToDrug.ToList().Select(x => x.DrugId.ToString()).ToList();
            var regions = DB.Regions((ulong)model.RegionMask);

            viewModel.RegionList = regions.Select(x => x.Id.ToString()).ToList();

            if (model.AllSuppliers)
            {
                viewModel.SuppierRegions = new List <string>()
                {
                    "0"
                }
            }
            ;
            else
            {
                viewModel.SuppierRegions = model.PromotionsToSupplier.Select(x => x.SupplierId.ToString()).ToList();
            }
            viewModel.SuppierRegionsList = h.GetSupplierList(regions.Select(x => x.Id).ToList())
                                           .Select(x => new TextValue {
                Text = x.Text, Value = x.Value
            })
                                           .ToList();
            viewModel.SuppierRegionsList.Add(new TextValue()
            {
                Text = "Все поставщики из выбранных регионов", Value = "0"
            });

            return(Json(viewModel, JsonRequestBehavior.AllowGet));
        }
        private long SaveNewPromotion(PromotionUi model)
        {
            var file       = SaveFile(model.File);
            var regionMask = model.RegionList.Select(x => (ulong)Convert.ToInt64(x)).Aggregate((y, z) => y | z);

            if (file == null)
            {
                if (model.PromotionFileId != null)
                {
                    file = DB2.MediaFiles.Find(model.PromotionFileId.Value);
                }
            }

            var promotion = new Promotion(CurrentUser)
            {
                Name       = model.Name,
                Annotation = model.Annotation,
                Begin      = Convert.ToDateTime(model.Begin),
                End        = Convert.ToDateTime(model.End),
                Author     = DB2.Users.Find(CurrentUser.Id),
                MediaFile  = file,
                RegionMask = (long)regionMask,
            };

            DB2.Promotions.Add(promotion);
            DB2.SaveChanges();

            foreach (var item in model.DrugList)
            {
                var promotionToDrug = new PromotionToDrug()
                {
                    DrugId      = Convert.ToInt64(item),
                    PromotionId = promotion.Id
                };
                DB2.PromotionToDrugs.Add(promotionToDrug);
            }

            if (model.SuppierRegions.Contains("0"))
            {
                model.SuppierRegions   = h.GetSupplierList(model.SuppierRegions.ToList().Select(x => (ulong)Convert.ToInt64(x)).ToList()).ToList().Select(x => x.Value).ToList();
                promotion.AllSuppliers = true;
            }
            else
            {
                promotion.AllSuppliers = false;
            }

            foreach (var item in model.SuppierRegions)
            {
                var X = new PromotionsToSupplier()
                {
                    PromotionId = promotion.Id, SupplierId = Convert.ToInt64(item)
                };
                DB2.PromotionsToSuppliers.Add(X);
            }
            DB2.PromotionHistory.Add(new PromotionSnapshot(CurrentUser, promotion, DB, DB2)
            {
                SnapshotName = "Добавление промоакции",
            });
            DB2.SaveChanges();
            Mails.PromotionNotification(MailType.CreatePromotion, promotion);
            return(promotion.Id);
        }
        private long ChangePromotion(PromotionUi model)
        {
            var promotion       = DB2.Promotions.Find(model.Id);
            var promotionToDrug = promotion.PromotionToDrug.ToList();

            foreach (var item in promotionToDrug)
            {
                var drugExsist = model.DrugList.Any(x => Convert.ToInt64(x) == item.DrugId);
                if (!drugExsist)
                {
                    DB2.PromotionToDrugs.Remove(item);
                }
            }
            foreach (var item in model.DrugList)
            {
                var drugExsist = promotion.PromotionToDrug.Any(x => x.DrugId == Convert.ToInt64(item));
                if (!drugExsist)
                {
                    PromotionToDrug newAddDrug = new PromotionToDrug()
                    {
                        DrugId      = Convert.ToInt64(item),
                        PromotionId = promotion.Id
                    };
                    DB2.PromotionToDrugs.Add(newAddDrug);
                }
            }

            var promoPromotionsToSupplier = promotion.PromotionsToSupplier.ToList();

            foreach (var item in promoPromotionsToSupplier)
            {
                var supllierExsist = model.SuppierRegions.Any(x => (ulong)Convert.ToInt64(x) == (ulong)item.SupplierId);
                if (!supllierExsist)
                {
                    DB2.PromotionsToSuppliers.Remove(item);
                }
            }
            if (model.SuppierRegions.Contains("0"))
            {
                model.SuppierRegions   = h.GetSupplierList(model.SuppierRegions.ToList().Select(x => (ulong)Convert.ToInt64(x)).ToList()).ToList().Select(x => x.Value).ToList();
                promotion.AllSuppliers = true;
            }
            else
            {
                promotion.AllSuppliers = false;
            }

            foreach (var item in model.SuppierRegions)
            {
                var supllierExsist = promotion.PromotionsToSupplier.Any(x => (ulong)x.SupplierId == (ulong)Convert.ToInt64(item));
                if (!supllierExsist)
                {
                    var addNew = new PromotionsToSupplier()
                    {
                        SupplierId  = Convert.ToInt64(item),
                        PromotionId = promotion.Id
                    };
                    promotion.PromotionsToSupplier.Add(addNew);
                }
            }

            ulong regionMask = 0;

            if (model.RegionList.Count() == 1)
            {
                regionMask = (ulong)Convert.ToInt64(model.RegionList.First());
            }
            else
            {
                regionMask = model.RegionList.Select(x => (ulong)Convert.ToInt64(x)).Aggregate((y, z) => y | z);
            }

            promotion.RegionMask = (long)regionMask;
            promotion.Name       = model.Name;
            promotion.Annotation = model.Annotation;
            promotion.Begin      = Convert.ToDateTime(model.Begin);
            promotion.End        = Convert.ToDateTime(model.End);
            promotion.Enabled    = true;
            promotion.Status     = PromotionStatus.New;
            promotion.Author     = DB2.Users.Find(CurrentUser.Id);

            var file = SaveFile(model.File);

            if (file != null)
            {
                promotion.MediaFile = file;
            }
            else if (model.PromotionFileId != null)
            {
                promotion.MediaFile = DB2.MediaFiles.Find(model.PromotionFileId.Value);
            }
            DB2.PromotionHistory.Add(new PromotionSnapshot(CurrentUser, promotion, DB, DB2));
            DB2.SaveChanges();
            Mails.PromotionNotification(MailType.EditPromotion, promotion);
            return(promotion.Id);
        }