protected void Page_Load(object sender, EventArgs e)
        {
            // выбираем значения из post запроса
            Guid[] prods = Request["products"].Split(',').Select(p => new Guid(p)).ToArray(); //120420
               // List<Guid> prods = Request["products"].Split(',').Select(p => new Guid(p)).ToList();
            Guid srcProductID = new Guid(Request["left_uid"]);
            Guid dstProductID = new Guid(Request["right_uid"]);
               //List<string> qdus_new = Request["qdus_new"].Split(',').ToList<string>(); //120420
             string[] qdus_new = Request["qdus_new"].Split(',').ToArray(); //120420

            // для каждого продукта в списке [products] выполняем
            // замену исходного продукта на целевой
               // foreach (Guid prod in prods) //120420
             for (int i = 0; i < prods.Length; i++) //120420

            {
                 using (ProductProvider provider = new ProductProvider())
                {

                      // создаём новую версию продукта
                    Guid newprod = provider.CreateNewVersionOfProduct(prods[i], Guid.Empty);

                    // берём все исходные детали для замены
                    // их может быть несколько
                    List<Aspect.Domain.Configuration> srcConfs, dstConfs;
                    srcConfs = provider.Configurations.Where(p => p.ProductOwnerID == newprod && p.ProductID == srcProductID).ToList();
                    dstConfs = new List<Aspect.Domain.Configuration>();

                    // создаём на базе исходных деталей - целевые с такими же параметрами
                    using (ConfigurationProvider confProvider = new ConfigurationProvider())
                    {
                        foreach (Aspect.Domain.Configuration conf in srcConfs)
                        {
                            Aspect.Domain.Configuration newconf = confProvider.CopyConfiguration(conf);
                            newconf.ID = Guid.NewGuid();
                            newconf.ProductID = dstProductID;
                            newconf.Quantity = Convert.ToDecimal(qdus_new[i]);
                            dstConfs.Add(newconf);
                        }
                    }

                    // удаляем из спецификации исходные продукты
                    // вставляем в спецификацию новые продукты
                    provider.Configurations.DeleteAllOnSubmit(srcConfs);
                    provider.Configurations.InsertAllOnSubmit(dstConfs);
                    provider.SubmitChanges();

                    // устанавливаем признак основной версии
                    ProductProperty prop = provider.ProductProperties.Where(
                        p => p.ProductID == newprod &&
                        p.PropertyID == new Guid("BBE170B0-28E4-4738-B365-1038B03F4552")).Single();
                    prop.Value = "1";
                    provider.SubmitChanges();
                }
            }
        }
예제 #2
0
        public static string ExchangeKmhInOrders(List<Guid> orderArticles, DateTime timeStamp, Guid prodNomenId, TechnDatesSpeciality speciality)
        {
            using (ProductProvider provider = new ProductProvider())
            {
                var dates = from date in provider.TechnDates
                            where orderArticles.Contains(date.OrderArticleID)
                            && date._dictNomenID == prodNomenId
                            select date;
                foreach (var date in dates)
                {
                    switch (speciality)
                    {
                        case TechnDatesSpeciality.Main:
                            date.gen_date = timeStamp.ToLocalTime();
                            break;
                        case TechnDatesSpeciality.Svar:
                            date.svar_date = timeStamp.ToLocalTime();
                            break;
                        case TechnDatesSpeciality.Him:
                            date.him_date = timeStamp.ToLocalTime();
                            break;
                        case TechnDatesSpeciality.Techn:
                            date.techn_date = timeStamp.ToLocalTime();
                            break;
                    }
                }

                provider.SubmitChanges();
            }

            return new PostResult("Ok", 0).ToString();
        }
예제 #3
0
        public static void SaveRouteInternal(Guid _Product_ID, Guid _Material_ID, string Route)
        {
            DateTime currentDT = DateTime.Now;
            Route = Route.Trim();

            using (ProductProvider provider = new ProductProvider())
            {
                // получаем действующие (по времени) маршруты по применяемости
                // для данного продукта в данной сборке
                // ! в идеале такой маршрут должен быть один

                var routes = from rt in provider.Specification_3s
                             where rt._Product_ID == _Product_ID
                             && rt._Material_ID == _Material_ID
                             && rt.StartDT <= currentDT
                             && rt.FinishDT > currentDT
                             select rt;

                // завершаем маршруты текущей датой
                foreach (var route in routes)
                {
                    route.FinishDT = currentDT;
                }

                // создаём новый маршрут по применяемости, если он не пустой
                if (!String.IsNullOrEmpty(Route))
                {
                    Specification_3 newRoute = new Specification_3()
                    {
                        id = Guid.NewGuid(),
                        _Product_ID = _Product_ID,
                        _Material_ID = _Material_ID,
                        Route = Route,
                        dtle = currentDT,
                        StartDT = currentDT,
                        FinishDT = DateTime.MaxValue
                    };
                    try
                    {
                        newRoute.userID = (Guid)HttpContext.Current.Session["userID"];
                    }
                    catch { }
                    provider.Specification_3s.InsertOnSubmit(newRoute);
                }

                provider.SubmitChanges();
            }
        }
예제 #4
0
        public static string SaveKmhCard(transfer card, int saveType, Guid order_id)
        {
            DateTime CurDateTime = DateTime.Now;

            // saveType == 1 (сохранить как основную)
            // saveType == 2 (сохранить как приказную)
            // saveType == 3 (как приказную и как основную)

            using (ProductProvider provider = new ProductProvider())
            {
                // {!} здесь может быть проблемное место, потому что надо оборачивать действия
                // в одну транзакцию

                // проходим два раза по коду
                // 1 - стандартная карточка
                // 2 - карточка по приказу

                for (int index = 1; index <= 2; index++)
                {
                    if (saveType == 2 && index == 1) continue;
                    if (saveType == 1 && index == 2) continue;

                    // получаем все существующие стандарные карты для данного продукта
                    var all_kmh = from kmh in provider.Specification_1s
                                  where Object.Equals(kmh.OrderArticleID, index == 1 ? null : new Guid?(order_id))
                                  && kmh._Product_ID == card.prod_id
                                  select kmh;

                    // переносим полученные данные в карту
                    Specification_1 savedCard = new Specification_1();
                    savedCard.id = Guid.NewGuid();
                    savedCard.OrderArticleID = (index == 1 ? null : new Guid?(order_id));
                    LoadKmh(savedCard, card);

                    // устанавливаем время действия карты
                    savedCard.FinishDT = PlusInfinity;
                    if (all_kmh.Count() == 0)
                    {
                        // если других карт нету, даты от -∞ до +∞
                        // savedCard.StartDT = MinusInfinity;
                        savedCard.StartDT = CurDateTime;

                    }
                    else
                    {
                        // если другие карты есть, дата от CurDateTime+1 до +∞
                        savedCard.StartDT = CurDateTime;

                        // выбираем актуальные карты и завершаем дату их действия
                        List<Specification_1> actual_kmh = all_kmh.Where(c => c.StartDT <= CurDateTime && c.FinishDT > CurDateTime).ToList();
                        foreach (Specification_1 iter_kmh in actual_kmh)
                        {
                            iter_kmh.FinishDT = CurDateTime;
                        }
                    }

                    savedCard.dtle = CurDateTime;
                    try
                    {
                        savedCard.userID = (Guid)HttpContext.Current.Session["userID"];
                    }
                    catch { }
                    provider.Specification_1s.InsertOnSubmit(savedCard);
                }

                // Сохраняем изменения
                provider.SubmitChanges();
            }
            PostResult result = new PostResult("ok", 0) { TimeStamp = CurDateTime.ToUniversalTime() };
            return  result.ToString();
        }
예제 #5
0
        public static string SaveAddMaterials(List<transfer_add> list, Guid prodid, int saveType, Guid order_id, Guid ste_id)
        {
            DateTime CurDateTime = DateTime.Now;

            // saveType == 1 (сохранить как основную)
            // saveType == 2 (сохранить как приказную)
            // saveType == 3 (как приказную и как основную)

            using (ProductProvider provider = new ProductProvider())
            {
                // {!} здесь может быть проблемное место, потому что надо оборачивать действия
                // в одну транзакцию

                // проходим два раза по коду
                // 1 - стандартная карточка
                // 2 - карточка по приказу
                for (int index = 1; index <= 2; index++)
                {
                    if (saveType == 2 && index == 1) continue;
                    if (saveType == 1 && index == 2) continue;

                    // получаем актуальные на текущий момент дополнительные материалы
                    var all_kmh = from kmh in provider.Specification_2s
                                  where Object.Equals(kmh.OrderArticleID, index == 1 ? null : new Guid?(order_id))
                                  && kmh._Product_ID == prodid
                                  && kmh._dictS_TEID == ste_id
                                  select kmh;

                    // перебераем только актуальные карты
                    // и завершаем их по текущей дате
                    foreach (var kmh in all_kmh.Where(it => it.StartDT <= CurDateTime && it.FinishDT > CurDateTime))
                    {
                        kmh.FinishDT = CurDateTime;
                    }

                    // если в списке нет доп. материалов, то вставляем
                    // специальный материал с Guid = {00000000-0000-0000-0000-000000000000}
                    if (list.Count == 0)
                    {
                        list.Add(new transfer_add()
                        {
                            material_id = Guid.Empty
                        });
                    }

                    // создаём новые карты материалов
                    foreach (transfer_add new_kmh in list)
                    {
                        provider.Specification_2s.InsertOnSubmit(new Specification_2()
                        {
                            id = Guid.NewGuid(),
                            _Product_ID = prodid,
                            _Material_ID = new_kmh.material_id,
                            // если данный материал уже применялся, то дата начинается с текущего момента
                            // если же данный материал добавлен впервые то дата начаинается с -∞
                            // StartDT = all_kmh.Count(it => it._Material_ID == new_kmh.material_id) > 0 ? CurDateTime : MinusInfinity,
                            StartDT = CurDateTime,
                            FinishDT = PlusInfinity,
                            no = new_kmh.no,
                            _dictUMID = new_kmh.um_id,
                            _dictSID = new_kmh.s_id,
                            _dictS_TEID = ste_id,
                            OrderArticleID = (index == 1 ? null : new Guid?(order_id))
                        });
                    }

                }

                // Сохраняем изменения
                provider.SubmitChanges();
            }
            PostResult result = new PostResult("ok", 0) { TimeStamp = CurDateTime.ToUniversalTime() };
            return result.ToString();
        }
예제 #6
0
        public static string TechDatesSave(Guid _dictNomenID, Guid OrderArticleID, DateTime? gen_date,
            DateTime? him_date, DateTime? svar_date, DateTime? techn_date)
        {
            try
            {
                using (ProductProvider provider = new ProductProvider())
                {
                    // select row with dates from DB
                    var unit_dates = provider.TechnDates.SingleOrDefault(it => it._dictNomenID == _dictNomenID && it.OrderArticleID == OrderArticleID);

                    // if row doesn't exists create new row
                    if (unit_dates == null)
                    {
                        unit_dates = new TechnDate()
                        {
                            _dictNomenID = _dictNomenID,
                            OrderArticleID = OrderArticleID
                        };
                        provider.TechnDates.InsertOnSubmit(unit_dates);
                    }

                    // clear dates if needed and save dates to row
                    if (gen_date.HasValue)
                    {
                        unit_dates.gen_date = (gen_date == DateTime.MinValue) ? null : gen_date;
                    }
                    if (him_date.HasValue)
                    {
                        unit_dates.him_date = (him_date == DateTime.MinValue) ? null : him_date;
                    }
                    if (svar_date.HasValue)
                    {
                        unit_dates.svar_date = (svar_date == DateTime.MinValue) ? null : svar_date;
                    }
                    if (techn_date.HasValue)
                    {
                        unit_dates.techn_date = (techn_date == DateTime.MinValue) ? null : techn_date;
                    }

                    // if row contain all nulled fields delete it
                    if (unit_dates.techn_date == null &&
                        unit_dates.him_date == null &&
                        unit_dates.svar_date == null &&
                        unit_dates.gen_date == null)
                    {
                        provider.TechnDates.DeleteOnSubmit(unit_dates);
                    }

                    // save dates to DB
                    provider.SubmitChanges();
                }
                return new PostResult("Ok", 0).ToString();
            }
            catch (Exception e)
            {
                return new PostResult("Unknown exception: " + e.Message, -1).ToString();
            }
        }
예제 #7
0
        public static string SetColumns(List<transfer_column> columns, Guid ClassificationTreeId)
        {
            Guid userID;
            try
            {
                userID = (Guid)HttpContext.Current.Session["userID"];
            }
            catch
            {
                return new PostResult("Lose user session. Please reconnect.", 102).ToString();
            }

            using (ProductProvider provider = new ProductProvider())
            {
                // delete existing settings
                var columnIDs = columns.Select(it => it.uid);
                var forDelete = from col in provider.ColumnWidths
                                where col.ClassificationTreeID == ClassificationTreeId
                                && col.UserID == userID
                                && columnIDs.Contains(col.ColumnID)
                                select col;
                provider.ColumnWidths.DeleteAllOnSubmit(forDelete);
                provider.SubmitChanges();

                // saving new settings
                foreach (var column in columns)
                {
                    provider.ColumnWidths.InsertOnSubmit(new ColumnWidth()
                    {
                        ID = Guid.NewGuid(),
                        ClassificationTreeID = ClassificationTreeId,
                        UserID = userID,
                        ColumnID = column.uid,
                        Width = column.width,
                        Index = column.position,
                        Hidden = column.hidden
                    });
                }
                provider.SubmitChanges();
            }

            return new PostResult("ok", 0).ToString();
        }
예제 #8
0
        protected void ItemCommand(Object Sender, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "com.delete")
            {
                using (ProductProvider provider = new ProductProvider())
                {
                    var userFile = provider.UserFiles.SingleOrDefault(it => it.id == new Guid((string)e.CommandArgument));

                    if (userFile != null)
                    {
                        provider.UserFiles.DeleteOnSubmit(userFile);

                        String savePath = Path.Combine(Request.PhysicalApplicationPath, "UserFiles");
                        File.Delete(Path.Combine(savePath, userFile.filename));

                        provider.SubmitChanges();
                    }
                }
            }

            DataBind();
        }
예제 #9
0
        protected void UploadButton_Click(object sender, EventArgs e)
        {
            // Specify the path on the server to
            // save the uploaded file to.
            String savePath = Path.Combine(Request.PhysicalApplicationPath, "UserFiles");

            // Before attempting to perform operations
            // on the file, verify that the FileUpload
            // control contains a file.
            if (FileUpload1.HasFile)
            {
                // Get the name of the file to upload.
                String fileName = FileUpload1.FileName;
                String savedFileName = String.Empty;
                int postfix = 0;

                // Append the name of the file to upload to the path.

                do
                {

                    if (postfix == 0)
                    {
                        savedFileName = Path.Combine(new string[] {savePath, fileName});
                    }
                    else
                    {
                        savedFileName = Path.Combine(new string[] {savePath, Path.GetFileNameWithoutExtension(fileName) + "_" + postfix + Path.GetExtension(fileName)});
                    }
                    postfix++;
                } while (File.Exists(savedFileName));

                FileUpload1.SaveAs(savedFileName);

                using (ProductProvider provider = new ProductProvider())
                {
                    var userFile = new UserFile()
                    {
                        id = Guid.NewGuid(),
                        pid = GetPID,
                        cid = Guid.Empty,
                        filename = Path.GetFileName(savedFileName),
                        username = Path.GetFileNameWithoutExtension(fileName)
                    };

                    provider.UserFiles.InsertOnSubmit(userFile);
                    provider.SubmitChanges();
                }

                DataBind();

                // Notify the user of the name of the file
                // was saved under.
                // UploadStatusLabel.Text = "Your file was saved as " + fileName;
            }
            else
            {
                // Notify the user that a file was not uploaded.
                // UploadStatusLabel.Text = "You did not specify a file to upload.";
            }
        }
예제 #10
0
        protected void SavaFileNames(object sender, EventArgs e)
        {
            using (ProductProvider provider = new ProductProvider())
            {
                Repeater repeater = (Repeater)FindControlRecursive(this.Master, "Repeater1");

                foreach (var repeaterItem in repeater.Controls)
                {
                    var hidden = (repeaterItem as RepeaterItem).FindControl("hiddenID") as HiddenField;
                    var edit = (repeaterItem as RepeaterItem).FindControl("textUserName") as TextBox;

                    var userFile = provider.UserFiles.Single(it => it.id == new Guid(hidden.Value));
                    if (userFile != null && userFile.username != edit.Text)
                    {
                        userFile.username = edit.Text;
                    }
                }

                provider.SubmitChanges();
            }
        }
예제 #11
0
        public static string SaveForProduct(Guid product_id, Guid order_id, transfer_techn_dates dates)
        {
            try
            {
                using (ProductProvider provider = new ProductProvider())
                {
                    var product = provider.GetProduct(product_id);
                    if (product == null)
                    {
                        return new PostResult("Certain product not found.", 404).ToString();
                    }

                    // select row with dates from DB
                    var unit_dates = provider.TechnReadinesses.SingleOrDefault(it
                        => it._dictNomenID == product._dictNomenID
                        && it.OrderArticleID == order_id);

                    // if row doesn't exists create new row
                    if (unit_dates == null)
                    {
                        unit_dates = new TechnReadiness()
                        {
                            _dictNomenID = product._dictNomenID.Value,
                            OrderArticleID = order_id
                        };
                        provider.TechnReadinesses.InsertOnSubmit(unit_dates);
                    }

                    // clear dates if needed and save dates to row
                    unit_dates.techn_date = dates.techn_date;
                    unit_dates.svar_date = dates.svar_date;
                    unit_dates.him_date = dates.him_date;

                    // if row contain all nulled fields delete it
                    if (unit_dates.techn_date == null &&
                        unit_dates.him_date == null &&
                        unit_dates.svar_date == null)
                    {
                        provider.TechnReadinesses.DeleteOnSubmit(unit_dates);
                    }

                    // save dates to DB
                    provider.SubmitChanges();
                }
                return new PostResult("Ok", 0).ToString();
            }
            catch (Exception e)
            {
                return new PostResult("Unknown exception: " + e.Message, -1).ToString();
            }
        }
예제 #12
0
        protected void Save_Click(object sender, EventArgs e)
        {
            this.Validate();
            if (this.IsValid)
            {
                // Проверяем, является ли продукт основной версией
                ProductProvider productProvider = new ProductProvider();
                if (productProvider.IsMainVersion(this.ProductID))
                {
                    LabelErrorMessage.Text = "[ ! ] Содержащий данную спецификацию продукт является основной версией. Сохранение отменено.";
                    return;
                }

                JavaScriptSerializer js = new JavaScriptSerializer();
                List<Dictionary<string, string>> rows = js.Deserialize<List<Dictionary<string, string>>>(hiddenStoreData.Value.ToString());
                EditConfigurationProvider provider = new EditConfigurationProvider();
                List<GridColumn> gridColumns = provider.GetGridColumns();

                // Сохраняем данные, полученные от пользователя в списке конфигураций
                List<Aspect.Domain.Configuration> result = new List<Aspect.Domain.Configuration>();
                #region convert Request to list of Configuration
                foreach (Dictionary<string, string> row in rows)
                {
                    Guid productID = new Guid(row["ID"]);
                    Aspect.Domain.Configuration conf = new Aspect.Domain.Configuration();
                    conf.ID = new Guid(row["ConfID"]);
                    conf.ProductID = productID;
                    conf.ProductOwnerID = this.ProductID;
                    conf.UserID = this.User.ID;

                    foreach (GridColumn column in gridColumns)
                    {
                        if (column is EditableGridColumn)
                        {
                            System.Reflection.PropertyInfo prop = typeof(Aspect.Domain.Configuration).GetProperty(column.DataItem);
                            if (prop.PropertyType == typeof(decimal) || prop.PropertyType == typeof(Nullable<decimal>))
                            {
                                prop.SetValue(conf, Convert.ToDecimal(row[column.DataItem]), null);
                            }
                            else if (prop.PropertyType == typeof(int) || prop.PropertyType == typeof(Nullable<int>))
                            {
                                prop.SetValue(conf, Convert.ToInt32(row[column.DataItem]), null);
                            }
                            else if (prop.PropertyType == typeof(Guid) || prop.PropertyType == typeof(Nullable<Guid>))
                            {
                                prop.SetValue(conf, new Guid(row[column.DataItem]), null);
                            }
                            else if (prop.PropertyType == typeof(Boolean) || prop.PropertyType == typeof(Nullable<Boolean>))
                            {
                                prop.SetValue(conf, Convert.ToBoolean(row[column.DataItem]), null);
                            }
                            else
                            {
                                prop.SetValue(conf, row[column.DataItem], null);
                            }
                        }
                    }

                    result.Add(conf);
                }
                #endregion

                using (CommonDomain domain = new CommonDomain())
                {
                    // Проверка на включение материалов
                    #region check_including_material
                    foreach (Aspect.Domain.Configuration conf in result)
                    {
                        Product prod = domain.Products.Single(p => p.ID == conf.ProductID);
                        if (prod._dictNomen.cod >= 1000000)
                        {
                            LabelErrorMessage.Text = "[ ! ] Обнаружены материалы в спецификации. Сохранение отменино.";
                            return;
                        }
                    }
                    #endregion

                    // Проверка на циклы
                    #region check_for_cycles
                    Guid dictNomenID = (Guid) (from p in domain.Products
                                               where p.ID == this.ProductID
                                               select p).Single()._dictNomenID;
                    foreach (Aspect.Domain.Configuration conf in result)
                    {
                        Product prod = domain.Products.Where(p => p.ID == conf.ProductID).Single();
                        if (dictNomenID == prod._dictNomenID)
                        {
                            LabelErrorMessage.Text = "[ ! ] Обнаружены циклические включения продуктов в спецификацию. Сохранение отменино.";
                            return;
                        }
                        if (fnCheckContains(dictNomenID, prod.ID))
                        {
                            LabelErrorMessage.Text = "[ ! ] Обнаружены циклические включения продуктов в спецификацию. Сохранение отменино.";
                            return;
                        }
                    }
                    #endregion
                }

                provider.SaveProductConfiguration(this.ProductID, result, this.User.ID);

                // установка признака "Основная версия"
                if (MadeBasicVersion.Checked)
                {
                    productProvider.SetMainVersion(this.User.ID, new List<Guid>{ProductID});
                }

                // устанавливаем основание изменений
                if (!String.IsNullOrEmpty(ReasonChanges.Text))
                {
                    ProductProperty reasonProperty = productProvider.ProductProperties.SingleOrDefault(
                        pr => pr.PropertyID == new Guid("C266B994-9740-41F6-94DD-07EA5B5FA34A")
                        && pr.ProductID == this.ProductID);

                    if (reasonProperty == null)
                    {
                        reasonProperty = new ProductProperty()
                        {
                            ID = Guid.NewGuid(),
                            PropertyID = new Guid("C266B994-9740-41F6-94DD-07EA5B5FA34A"),
                            ProductID = this.ProductID,
                            Value = ReasonChanges.Text
                        };
                        productProvider.ProductProperties.InsertOnSubmit(reasonProperty);
                    }
                    else
                    {
                        reasonProperty.Value = ReasonChanges.Text;
                    }
                    productProvider.SubmitChanges();
                }

                // Очищаем сообщение об ошибке и обновляем данные о спецификации
                LabelErrorMessage.Text = "";
                this.BindGridColumns2();
                this.BindData(new Dictionary<Guid, Guid>());
            }
        }
예제 #13
0
        protected void SaveButton_Click(object sender, EventArgs e)
        {
            //if (this.IsNew)
            //{
                string version = null;
                string nomenValue = null;
                CustomValidator validator1 = null;
                CustomValidator validator2 = null;
                #region Get the @version
                foreach (RepeaterItem item in GeneralPropertyRepeater.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        Guid id = new Guid((item.FindControl("HiddenID") as HiddenField).Value);
                        if (id == new Guid("0789DB1A-9BAA-4574-B405-AE570C746C03"))
                        {
                            EditControl editControl = item.FindControl("PropertyValueAdv") as EditControl;
                            if (!editControl.Validate()) return;
                            version = editControl.Value.ToString().Trim();
                            //version = (item.FindControl("PropertyValue") as TextBox).Text.Trim();
                            validator1 = item.FindControl("UniqueValueValidator") as CustomValidator;
                        }
                    }
                }
                #endregion
                #region Get the @nomenValue
                foreach (RepeaterItem item in DictionaryPropertyRepeater.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        Guid dictId = new Guid((item.FindControl("HiddenTreeID") as HiddenField).Value);
                        if (dictId == new Guid("316C6BC7-D883-44C8-AAE0-602F49C73595"))
                        {
                            nomenValue = (item.FindControl("HiddenID") as HiddenField).Value;
                            validator2 = item.FindControl("UniqueValueValidator") as CustomValidator;
                        }
                    }
                }
                #endregion
                #region Check the unique @version && @nomenValue
                if (version != null && nomenValue != null && validator1 != null && validator2 != null)
                {
                    using (ProductProvider provider = new ProductProvider())
                    {
                        var q = from p in provider.Products
                                join pp in provider.ProductProperties on p.ID equals pp.ProductID
                                where pp.PropertyID == new Guid("0789DB1A-9BAA-4574-B405-AE570C746C03") //&& p.ID == this.RequestProductID
                                && pp.Value == version && p._dictNomenID == new Guid(nomenValue)
                                select p;
                        List<Product> list = q.ToList();
                        if (list.Count > 0 && this.IsNew)
                        {
                            validator1.IsValid = false;
                            validator2.IsValid = false;
                            return;
                        }
                        else if (list.Count > 0 && list.Where(p => p.ID == this.RequestProductID).Count() == 0)
                        {
                            validator1.IsValid = false;
                            validator2.IsValid = false;
                            return;
                        }
                    }
                }
                else
                {
                    return;
                }
                #endregion
                #region Check the main version canceling...
                string mainVersionValue = null;
                CustomValidator mainVersionValidator = null;
                foreach (RepeaterItem item in GeneralPropertyRepeater.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        Guid id = new Guid((item.FindControl("HiddenID") as HiddenField).Value);
                        if (id == new Guid("bbe170b0-28e4-4738-b365-1038b03f4552"))
                        {
                            EditControl editControl = item.FindControl("PropertyValueAdv") as EditControl;
                            if (!editControl.Validate()) return;
                            mainVersionValue = editControl.Value.ToString().Trim();
                            mainVersionValidator = item.FindControl("UniqueValueValidator") as CustomValidator;
                        }
                    }
                }
                if (mainVersionValue != null && mainVersionValidator != null && !this.IsNew)
                {
                    using (ProductProvider provider = new ProductProvider())
                    {
                        var q = from p in provider.ProductProperties
                                where p.PropertyID == new Guid("bbe170b0-28e4-4738-b365-1038b03f4552")
                                && p.ProductID == this.RequestProductID
                                select p;
                        List<ProductProperty> list = q.ToList();
                        if (list.Count == 1)
                        {
                            // попытка изменить основную версию
                            if (list.First().Value == "1")
                            {
                                mainVersionValidator.IsValid = false;
                                return;
                            }
                        }
                    }
                }
                #endregion
                //}
            if (this.IsNew)
            {
                using (ProductProvider provider = new ProductProvider())
                {
                    Guid newID = provider.AddNewProduct(this.RequestProductID, User.ID);
                    if (this.IsWithConfs)
                    {
                        // копирование по аналогу вместе с составом
                        provider.CopyConfiguration(this.RequestProductID, newID, this.User.ID);
                    }
                    newProductID = newID;
                }
            }

            using (ProductProvider provider = new ProductProvider())
            {
                Product editedProduct = provider.GetProduct(RequestProductID);
                if (editedProduct.userID != User.ID)
                {
                    editedProduct.userID = User.ID;
                    provider.SubmitChanges();
                }
            }

            #region update dictionary values
            using (DictionaryProvider provider = new DictionaryProvider())
            {
                foreach (RepeaterItem item in DictionaryPropertyRepeater.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        Guid dictId = new Guid((item.FindControl("HiddenTreeID") as HiddenField).Value);
                        string valueString = (item.FindControl("HiddenID") as HiddenField).Value;
                        DictionaryTree dict = provider.DictionaryTrees.Single(d => d.ID == dictId);
                        if (!string.IsNullOrEmpty(valueString) && !(new Guid(valueString).Equals(Guid.Empty)))
                        {
                            provider.SetProductDictioanryValue(this.RequestProductID, dict.FK, valueString.Trim(), User.ID);
                        }
                        else
                        {
                            provider.DeleteProductDictionaryValue(this.RequestProductID, dict.FK, User.ID);
                        }
                    }
                }
                provider.SubmitChanges();
            }
            #endregion

            #region update properties values
            using (ProductProvider provider = new ProductProvider())
            {
                bool settingMainVersion = false;

                foreach (RepeaterItem item in GeneralPropertyRepeater.Items)
                {
                    if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                    {
                        Guid id = new Guid((item.FindControl("HiddenID") as HiddenField).Value);
                        //string value = (item.FindControl("PropertyValue") as TextBox).Text.Trim();
                        EditControl editControl = item.FindControl("PropertyValueAdv") as EditControl;
                        if (!editControl.IsEmpty && !editControl.Validate())
                        {
                            continue;
                        }

                        // Если поле "Вес по приказу" не заполнено, то заполняем его из номенклатуры
                        if (id == new Guid("AC37F816-E4C1-4751-99ED-6180D7CCA142") && editControl.IsEmpty)
                        {
                            Product prod = provider.GetProduct(this.RequestProductID);
                            if (prod._dictNomen.pw.HasValue)
                            {
                                editControl.Value = prod._dictNomen.pw.Value.ToString(CultureInfo.InvariantCulture).Replace(".", ",");
                            }

                        }

                        if (editControl.IsEmpty)
                        {
                            ProductProperty prop = provider.ProductProperties.SingleOrDefault(pp => pp.PropertyID == id && pp.ProductID == this.RequestProductID);
                            if (prop != null)
                            {
                                provider.ProductProperties.DeleteOnSubmit(prop);
                                provider.SubmitChanges();
                            }
                            continue;
                        }

                        string value = editControl.Value.ToString().Trim();
                        if (editControl.ControlType == TypeEnum.Datetime)
                        {
                            DateTime dt = DateTime.ParseExact(value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
                            if (dt == DateTime.MinValue) value = string.Empty;
                            else value = dt.ToString("yyyy-MM-dd hh:mm:ss.fff");
                        }

                        // установка признака "Основная версия"
                        if (id == new Guid ("BBE170B0-28E4-4738-B365-1038B03F4552") && value == "1")
                        {
                            settingMainVersion = true;
                        }

                        ProductProperty property = provider.ProductProperties.SingleOrDefault(pp => pp.PropertyID == id && pp.ProductID == this.RequestProductID);
                        if (property != null)
                        {
                            if (property.Value != value)
                            {
                                Aspect.Utility.TraceHelper.Log(User.ID, "Продукт: {0}. Свойство изменино: {1}. Старое значение {2}. Новое значение {3}", this.RequestProductID, property.Property.Name, property.Value, value);
                            }
                            property.Value = value;
                        }
                        else
                        {
                            property = new ProductProperty()
                            {
                                ID = Guid.NewGuid(),
                                ProductID = this.RequestProductID,
                                PropertyID = id,
                                Value = value
                            };
                            provider.ProductProperties.InsertOnSubmit(property);
                            Property prop = provider.Properties.Single(p => p.ID == id);
                            Aspect.Utility.TraceHelper.Log(User.ID, "Продукт: {0}. Свойство изменино: {1}. Старое значение NULL. Новое значение {2}", this.RequestProductID, prop.Name, value);
                        }
                        provider.SubmitChanges();
                    }
                }

                // Переносим вес из продуктов в _dictNomen, если там он отсутствует (0 или null)
                if (settingMainVersion)
                {
                    try
                    {
                        // Пытаемся получить свойство с весом если оно есть
                        string raw_pw = (from p in provider.Products
                                      join pp in provider.ProductProperties on p.ID equals pp.ProductID
                                      where p.ID == this.RequestProductID && pp.PropertyID == new Guid("AC37F816-E4C1-4751-99ED-6180D7CCA142")
                                      select pp.Value).Single();
                        decimal prod_pw = Convert.ToDecimal(raw_pw.Replace(',', '.'), CultureInfo.InvariantCulture);

                        // Если свойство есть переносим его
                        if (prod_pw != 0)
                        {
                            _dictNomen dict = (from p in provider.Products
                                               join d in provider._dictNomens on p._dictNomenID equals d.ID
                                               where p.ID == this.RequestProductID
                                               select d).Single();
                            dict.pw = prod_pw;
                            provider.SubmitChanges();
                        }
                    }
                    catch
                    {
                        // перехватываем исключение, так как веса у продукта может вовсе и не быть
                    }
                }
            }
            #endregion

            if (this.IsNew)
            {
                // добавить свойство "пустой состав"
                if (!this.IsWithConfs)
                {
                    using (CommonDomain provider = new CommonDomain())
                    {
                        var properties = from props in provider.ProductProperties
                                         where props.PropertyID == new Guid("00ACC1C7-6857-4317-8713-8B8D9479C5CC") // Свойство "Наличие состава"
                                         && props.ProductID == RequestProductID
                                         select props;

                        if (properties.Count() > 1)
                        {
                            // если несколько одинаковых свойств - генерируем исключение
                            throw new Exception("У продукта не может быть больше одного свойства \"Наличие состава\"!");
                        }
                        else if (properties.Count() == 1)
                        {
                            // если только одно свойство - редактируем его, и сохраняемся
                            properties.First().Value = "-";
                        } else
                        {
                            // если нет ниодного свойства, создаём его с нужным нам значеним
                            provider.ProductProperties.InsertOnSubmit(new ProductProperty()
                            {
                                ID = Guid.NewGuid(),
                                ProductID = RequestProductID,
                                PropertyID = new Guid("00ACC1C7-6857-4317-8713-8B8D9479C5CC"),
                                Value = "-"
                            });

                        }
                        provider.SubmitChanges();
                    }
                }

                // перенаправить на редактирование
                Response.Redirect(string.Format("Edit.aspx?ID={0}", this.RequestProductID));
                return;
            }
            if(Page.IsValid) this.DataLoad();
        }