Exemple #1
0
        /// <summary>
        /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных.
        /// </summary>
        protected override void PreApplyToControls()
        {
            SQLWhereLanguageDef ld = SQLWhereLanguageDef.LanguageDef;

            if (Context.User.IsInRole("Продавец") && this.DataObject == null)
            {
                // Определяем текущего пользователя
                var          currentUser = Context.User.Identity.Name;
                IDataService ds          = DataServiceProvider.DataService;
                var          lcs         = LoadingCustomizationStruct.GetSimpleStruct(typeof(Продавец), "ПродавецL");
                lcs.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                   new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продавец>(x => x.Логин)), currentUser);
                var manager = ds.LoadObjects(lcs)[0] as Продавец;

                // Устанавливаем текущего продавца в поле заказа
                this.DataObject = new Заказ();
                this.DataObject.ТорговаяТочка = manager.ТорговаяТочка;
                ctrlТорговаяТочка.Enabled     = false;
            }

            ctrlСтрокаЗаказа.AddLookUpSettings(Information.ExtractPropertyPath <СтрокаЗаказа>(r => r.Продукт), new LookUpSetting
            {
                LimitFunction = ld.GetFunction(ld.funcEQ,
                                               new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продукт>(r => r.Статус)), "В продаже"),
                ColumnsSort = new ColumnsSortDef[] { new ColumnsSortDef("Код", SortOrder.Asc) }
            });
            if (DataObject.Состояние == СостояниеЗаказа.Оплаченный)
            {
                ctrlСостояние.Enabled = false;
            }
        }
        /// <summary>
        /// Конструктор формы
        /// </summary>
        public RoleE() : base("Sec_AgentL")
        {
            _languageDef = SQLWhereLanguageDef.LanguageDef;


            Function limitIsUser = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsUser"), true);
            LoadingCustomizationStruct lcsAllUsers = new LoadingCustomizationStruct(null);

            lcsAllUsers.LoadingTypes  = new[] { typeof(Agent) };
            lcsAllUsers.LimitFunction = limitIsUser;
            lcsAllUsers.View          = Information.GetView("Sec_AgentL", typeof(Agent));
            _allUsers =
                BridgeToDS.GetDataService().LoadObjects(lcsAllUsers).Cast <Agent>().ToList();


            Function limitIsRole = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsRole"), true);
            LoadingCustomizationStruct lcsAllRoles = new LoadingCustomizationStruct(null);

            lcsAllRoles.LoadingTypes  = new[] { typeof(Agent) };
            lcsAllRoles.LimitFunction = limitIsRole;
            lcsAllRoles.View          = Information.GetView("Sec_RolesL", typeof(Agent));
            _allRoles =
                BridgeToDS.GetDataService().LoadObjects(lcsAllRoles).Cast <Agent>().ToList();


            Function limitIsClass = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsClass"), true);
            LoadingCustomizationStruct lcsAllClasses = new LoadingCustomizationStruct(null);

            lcsAllClasses.LoadingTypes  = new[] { typeof(Subject) };
            lcsAllClasses.LimitFunction = limitIsClass;
            lcsAllClasses.View          = Information.GetView("Sec_SubjectL", typeof(Subject));
            _allClasses =
                BridgeToDS.GetDataService().LoadObjects(lcsAllClasses).Cast <Subject>().ToList();
        }
        public void GetExistingVariableNamesNotFoundFunctionParametersExceptionTest()
        {
            var exception = Record.Exception(() =>
            {
                var obj = new MasterClass()
                {
                    StringMasterProperty = "prop", IntMasterProperty = 666
                };
                SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
                Function lf2 = langdef.GetFunction(
                    langdef.funcNOT,
                    langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, "MasterClass"), obj.DetailClass));
            });

            Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionParametersException), exception);
        }
Exemple #4
0
        public void GetObjectIndexesWithPksTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds           = dataService as SQLDataService;
                var            createdBear1 = new Медведь();
                createdBear1.ЦветГлаз = "Косолапый Мишка 1";
                ds.UpdateObject(createdBear1);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                Function findFunction = langDef.GetFunction(langDef.funcLike,
                                                            new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.ЦветГлаз)),
                                                            createdBear1.ЦветГлаз);

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, 101);

                // Assert.
                Assert.Equal(1, result.Count);
                Assert.True(result[1].IndexOf("{") > -1);

                Console.WriteLine(result[1]);
            }
        }
        /// <summary>
        /// Удалить все блокировки текущего юзера (какие есть в базе).
        /// В качестве сервиса данных используется переданный сервис данных.
        /// <param name="dataService">Сервис данных.</param>
        /// </summary>
        public static void ClearAllUserLocks(IDataService dataService)
        {
            var ds = dataService ?? DataServiceProvider.DataService;

            // убиваем все блокировки, оставшиеся с предыдущих времен
            SQLWhereLanguageDef lg = SQLWhereLanguageDef.LanguageDef;
            var vd = new VariableDef(lg.GetObjectTypeForNetType(typeof(string)), "UserName");

            Function func = lg.GetFunction(
                lg.funcEQ, vd, GetUserName() + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty));

            var lcs1 = new LoadingCustomizationStruct(0);

            var view = new View(typeof(LockData), View.ReadType.WithRelated);

            lcs1.Init(null, func, new[] { typeof(LockData) }, view, null);

            DataObject[] arr = ds.LoadObjects(lcs1);

            foreach (DataObject obj in arr)
            {
                obj.SetStatus(ObjectStatus.Deleted);
            }

            ds.UpdateObjects(ref arr);
        }
Exemple #6
0
        /// <summary>
        /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных.
        /// </summary>
        protected override void PreApplyToControls()
        {
            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;

            Function lf = langdef.GetFunction(langdef.funcEQ,
                                              new VariableDef(langdef.StringType, Information.ExtractPropertyName <Сотрудник>(x => x.Должность)), EnumCaption.GetCaptionFor(Должность.Менеджер));

            ctrlСотрудник.LimitFunction = lf;
        }
Exemple #7
0
        public void FunctionalLanguageDefGetFunctionExceptionTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

                var result = langDef.GetFunction("functionString");
            });

            Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionBySignatureException), exception);
        }
Exemple #8
0
        public void FunctionalLanguageDefGetFunctionException1Test()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                var result = langDef.GetFunction(langDef.funcEQ, new object[] { null });
            });

            Assert.IsType(typeof(NullReferenceException), exception);
        }
Exemple #9
0
 protected virtual void SetLimitFuncion(Function limitFunction, LoadingCustomizationStruct lcs)
 {
     if (lcs.LimitFunction != null)
     {
         // Для поддержки цепочного вызова Where необходимо объединить переданное ограничение с уже существующим.
         lcs.LimitFunction = langdef.GetFunction(langdef.funcAND, lcs.LimitFunction, limitFunction);
     }
     else
     {
         lcs.LimitFunction = limitFunction;
     }
 }
        /// <summary>
        /// Обычный Page_Load ASP.NET
        /// </summary>
        /// <param name="sender">Sender object</param>
        /// <param name="e">Event Args</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            SQLWhereLanguageDef languageDef = SQLWhereLanguageDef.LanguageDef;
            Function            limit       = languageDef.GetFunction(languageDef.funcEQ, new VariableDef(languageDef.BoolType, "IsClass"), true);

            WebObjectListView1.LimitFunction = limit;
            WebObjectListView1.View          = Information.GetView("Sec_SubjectL", typeof(Subject));
            WebObjectListView1.EditPage      = "~//forms//Security//Class//ClassE.aspx";

            WOLVSettApplyer wsa = new WOLVSettApplyer();

            wsa.SettingsApply(WebObjectListView1);
        }
Exemple #11
0
        public static string CreateLf(string[] ordKeys, string lfKey)
        {
            if (string.IsNullOrEmpty(lfKey))
            {
                lfKey = Guid.NewGuid().ToString("B");
            }

            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
            var clientKeys = new List <object>
            {
                new VariableDef(
                    langdef.GuidType,
                    SQLWhereLanguageDef.StormMainObjectKey)
            };

            clientKeys.AddRange(ordKeys);
            Function lf = langdef.GetFunction(langdef.funcNOT, langdef.GetFunction(langdef.funcIN, clientKeys.ToArray()));

            LimitFunctionsHolder.PersistLimitFunction(lfKey, lf);

            return(lfKey);
        }
Exemple #12
0
        public void TestEqualsExpressionWithObjectParameter()
        {
            // Arrange.
            var    testProvider = new TestQueryProvider <LinqProviderTestDataObject>();
            object value        = "{72FCA622-A01E-494C-BE1C-0821178594FB}";

            new Query <LinqProviderTestDataObject>(testProvider).Where(o => o.ObjectProperty == value).ToArray();
            Expression          queryExpression = testProvider.InnerExpression;
            SQLWhereLanguageDef langDef         = SQLWhereLanguageDef.LanguageDef;
            Function            expected        = langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.StringType, nameof(LinqProviderTestDataObject.ObjectProperty)), value);

            // Act.
            LoadingCustomizationStruct actual = LinqToLcs.GetLcs(queryExpression, typeof(LinqProviderTestDataObject));

            // Assert.
            Assert.Equal(expected, actual.LimitFunction);
        }
Exemple #13
0
        // *** Start programmer edit section *** (Period CustomMembers)
        /// <summary>
        /// Загрузить вложенные периоды.
        /// </summary>
        /// <param name="pВложенныеПериоды"></param>
        public void LoadВложенныеПериоды(System.Collections.ArrayList pВложенныеПериоды)
        {
            IDataService ds = DataServiceProvider.DataService;

            LoadingCustomizationStruct lcs = new LoadingCustomizationStruct(null);

            lcs.View         = Information.GetView("PeriodL", typeof(Period));
            lcs.LoadingTypes = new Type[] { typeof(Period) };
            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;

            ICSSoft.STORMNET.FunctionalLanguage.Function lf = langdef.GetFunction(langdef.funcEQ,
                                                                                  new VariableDef(langdef.NumericType, "Ierarhiia"), this.__PrimaryKey);

            lcs.LimitFunction = lf;

            ICSSoft.STORMNET.DataObject[] tmpПериоды = ds.LoadObjects(lcs);
            foreach (Period dobject in tmpПериоды)
            {
                pВложенныеПериоды.Add(dobject);
                ((Period)dobject).LoadВложенныеПериоды(pВложенныеПериоды);
            }
        }
Exemple #14
0
        public void GetObjectIndexesWithPksOrderingTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }
                // Arrange.
                SQLDataService      ds      = dataService as SQLDataService;
                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                List <DataObject> dataObjects = new List <DataObject>();
                bool isMssql = dataService.GetType() == typeof(MSSQLDataService) || dataService.GetType().IsSubclassOf(typeof(MSSQLDataService));

                // MSSQL в отличие от других хранилищ имеет свой формат сортировки гуидов. Для его поддержки приходится пользоваться специальным типом SqlGuid.
                List <SqlGuid> keysMssqlList    = new List <SqlGuid>();
                List <Guid>    keysPostgresList = new List <Guid>();

                // Создадим 1000 медведей.
                int objectsCount = 1000;
                for (int i = 0; i < objectsCount; i++)
                {
                    // Для простоты анализа проблем с данными, если они возникнут, выдадим ненастоящие последовательные гуиды.
                    byte[] bytes = new byte[16];
                    BitConverter.GetBytes(i).CopyTo(bytes, 0);
                    var pk = new Guid(bytes);
                    if (isMssql)
                    {
                        keysMssqlList.Add(pk);
                    }
                    else
                    {
                        keysPostgresList.Add(pk);
                    }

                    var createdBear = new Медведь
                    {
                        __PrimaryKey = pk,
                        ЦветГлаз     = "Косолапый Мишка " + i,
                        Вес          = i
                    };
                    dataObjects.Add(createdBear);
                }

                DataObject[] dataObjectsForUpdate = dataObjects.ToArray();
                ds.UpdateObjects(ref dataObjectsForUpdate);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                Function findFunction = langDef.GetFunction(langDef.funcL, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.Вес)), objectsCount);
                if (isMssql)
                {
                    keysMssqlList.Sort();
                }
                else
                {
                    keysPostgresList.Sort();
                }

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, null);

                // Assert.
                var values = result.Values.GetEnumerator();
                var keys   = result.Keys.GetEnumerator();

                for (int i = 0; i < objectsCount; i++)
                {
                    Assert.Equal(objectsCount, result.Count);

                    values.MoveNext();
                    keys.MoveNext();
                    string key = isMssql ? ((Guid)keysMssqlList[i]).ToString("B") : keysPostgresList[i].ToString("B");
                    Assert.Equal(key, values.Current);
                    Assert.Equal(i + 1, keys.Current);
                }
            }
        }
Exemple #15
0
        /// <summary>
        /// Selects messages from the database that can be sent.
        /// </summary>
        /// <param name="state">Not used.</param>
        private void ScanMessages(object state)
        {
            try
            {
                if (_sendingTasksCount >= MaxTasks)
                {
                    return;
                }

                IEnumerable <Subscription> subscriptions = _subscriptionsManager.GetCallbackSubscriptions();
                if (!subscriptions.Any())
                {
                    return;
                }

                foreach (var clientSubscriptions in subscriptions.GroupBy(s => s.Client))
                {
                    int  currentConnections = 0;
                    int  connectionsLimit   = clientSubscriptions.Key.ConnectionsLimit ?? DefaultConnectionsLimit;
                    Guid clientId           = (KeyGuid)clientSubscriptions.Key.__PrimaryKey;
                    if (!_clientConnections.TryGetValue(clientId, out currentConnections))
                    {
                        _clientConnections.Add(clientId, 0);
                    }

                    if (currentConnections >= connectionsLimit)
                    {
                        continue;
                    }

                    SQLWhereLanguageDef        langDef = SQLWhereLanguageDef.LanguageDef;
                    LoadingCustomizationStruct lcs     = LoadingCustomizationStruct.GetSimpleStruct(typeof(Message), Message.Views.SendingByCallbackView);

                    // All messages for this client by all its active subscriptions
                    Function clientLimitFunction = langDef.GetFunction(langDef.funcOR, clientSubscriptions.Select(s => langDef.GetFunction(
                                                                                                                      langDef.funcAND,
                                                                                                                      langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.Recipient)), s.Client.__PrimaryKey),
                                                                                                                      langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.MessageType)), s.MessageType.__PrimaryKey))).ToArray());

                    // Only unsent messages whose sending time has already arrived
                    lcs.LimitFunction = langDef.GetFunction(
                        langDef.funcAND,
                        clientLimitFunction,
                        langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.BoolType, Information.ExtractPropertyPath <Message>(m => m.IsSending)), false),
                        langDef.GetFunction(langDef.funcLEQ, new VariableDef(langDef.DateTimeType, Information.ExtractPropertyPath <Message>(m => m.SendingTime)), DateTime.Now));

                    // Get no more than we can send
                    lcs.ReturnTop   = connectionsLimit - currentConnections;
                    lcs.ColumnsSort = new[]
                    {
                        new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.Priority), SortOrder.Asc),
                        new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.SendingTime), SortOrder.Asc),
                    };

                    Stopwatch    stopwatch = Stopwatch.StartNew();
                    DataObject[] messages  = _dataService.LoadObjects(lcs);
                    stopwatch.Stop();
                    _statisticsService.NotifyAvgTimeSql(null, (int)stopwatch.ElapsedMilliseconds, $"PrioritySendingManager.ScanMessages(): Load {lcs.ReturnTop} messages for client with name: {clientSubscriptions.Key.Name}.");

                    int index = 0;
                    while (index < messages.Length && TryEnqueue((Message)messages[index]))
                    {
                        index++;
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.LogError("An error occurred while scanning messages.", exception.ToString());
            }
        }
        /// <summary>
        /// Вызывается самым последним в Page_Load
        /// </summary>
        protected override void Postload()
        {
            if (PK == null)
            {
                return;
            }


            Function limitByRole = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Role"), this.PK);

            LoadingCustomizationStruct lcsOwnUsers = new LoadingCustomizationStruct(null);

            lcsOwnUsers.LoadingTypes  = new[] { typeof(LinkRole) };
            lcsOwnUsers.LimitFunction = limitByRole;
            View usersView = Information.GetView("Sec_LinkRoleL", typeof(LinkRole));

            lcsOwnUsers.View = usersView;

            List <LinkRole> roleOwnUsers =
                BridgeToDS.GetDataService().LoadObjects(lcsOwnUsers).Cast <LinkRole>().ToList();

            if (IsPostBack)
            {
                #region Save Roles

                List <LinkRole> linkUsers = new List <LinkRole>();

                foreach (Agent user in _allUsers)
                {
                    string userKey = "User" + user.__PrimaryKey;

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(userKey)))
                    {
                        LinkRole linkUser = new LinkRole();
                        linkUser.Role  = DataObject;
                        linkUser.Agent = user;

                        linkUsers.Add(linkUser);
                    }
                }

                List <LinkRole> deletedUsers = new List <LinkRole>();

                foreach (LinkRole ownUser in roleOwnUsers)
                {
                    string ownId = ownUser.Agent.__PrimaryKey.ToString();

                    LinkRole singleOrDefault =
                        linkUsers.SingleOrDefault(r => r.Agent.__PrimaryKey.ToString().Equals(ownId));

                    if (singleOrDefault != null)
                    {
                        linkUsers.Remove(singleOrDefault);
                    }
                    else
                    {
                        ownUser.SetStatus(ObjectStatus.Deleted);
                        deletedUsers.Add(ownUser);
                    }
                }

                roleOwnUsers = roleOwnUsers.Except(deletedUsers).Union(linkUsers).ToList();
                linkUsers    = linkUsers.Union(deletedUsers).ToList();

                if (linkUsers.Count > 0)
                {
                    DataObject[] dataObjects = linkUsers.Cast <DataObject>().ToArray();
                    BridgeToDS.GetDataService().UpdateObjects(ref dataObjects);
                }

                #endregion
            }

            GenerateUsersTable(roleOwnUsers);



            Function limitByAgent = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Agent"), this.PK);

            LoadingCustomizationStruct lcsParentRoles = new LoadingCustomizationStruct(null);
            lcsParentRoles.LoadingTypes  = new[] { typeof(LinkRole) };
            lcsParentRoles.LimitFunction = limitByAgent;
            View rolesView = Information.GetView("Sec_LinkRoleL", typeof(LinkRole));
            lcsParentRoles.View = rolesView;

            List <LinkRole> parentRoles =
                BridgeToDS.GetDataService().LoadObjects(lcsParentRoles).Cast <LinkRole>().ToList();

            Agent single = _allRoles.Single(r => r.__PrimaryKey.ToString().Equals(this.PK));
            _allRoles.Remove(single);

            if (IsPostBack)
            {
                #region Save Roles

                List <LinkRole> linkRoles = new List <LinkRole>();

                foreach (Agent role in _allRoles)
                {
                    string roleKey = "Role" + role.__PrimaryKey;

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(roleKey)))
                    {
                        LinkRole linkRole = new LinkRole();
                        linkRole.Agent = DataObject;
                        linkRole.Role  = role;

                        linkRoles.Add(linkRole);
                    }
                }

                List <LinkRole> deletedRoles = new List <LinkRole>();

                foreach (LinkRole ownRole in parentRoles)
                {
                    string ownId = ownRole.Role.__PrimaryKey.ToString();

                    LinkRole singleOrDefault =
                        linkRoles.SingleOrDefault(r => r.Role.__PrimaryKey.ToString().Equals(ownId));

                    if (singleOrDefault != null)
                    {
                        linkRoles.Remove(singleOrDefault);
                    }
                    else
                    {
                        ownRole.SetStatus(ObjectStatus.Deleted);
                        deletedRoles.Add(ownRole);
                    }
                }

                parentRoles = parentRoles.Except(deletedRoles).Union(linkRoles).ToList();
                linkRoles   = linkRoles.Union(deletedRoles).ToList();

                if (linkRoles.Count > 0)
                {
                    DataObject[] dataObjects = linkRoles.Cast <DataObject>().ToArray();
                    BridgeToDS.GetDataService().UpdateObjects(ref dataObjects);
                }

                #endregion
            }

            GenerateRolesTable(parentRoles);



//            Function limitByAgent = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.GuidType, "Agent"), this.PK);

            LoadingCustomizationStruct lcsOwnClasses = new LoadingCustomizationStruct(null);
            lcsOwnClasses.LoadingTypes  = new[] { typeof(Permition) };
            lcsOwnClasses.LimitFunction = limitByAgent;
            View classesView = Information.GetView("Sec_PermitionE", typeof(Permition));
            lcsOwnClasses.View = classesView;

            List <Permition> userOwnClasses =
                BridgeToDS.GetDataService().LoadObjects(lcsOwnClasses).Cast <Permition>().ToList();

            List <Permissions> permissions = new List <Permissions>();

            foreach (Subject @class in _allClasses)
            {
                Permissions u2c = new Permissions();

                u2c.ObjectId   = @class.__PrimaryKey.ToString();
                u2c.ObjectName = @class.Name;

                Permition firstOrDefault =
                    userOwnClasses.FirstOrDefault(c => c.Subject.__PrimaryKey.ToString().Equals(u2c.ObjectId));

                if (firstOrDefault != null && firstOrDefault.Access != null)
                {
                    for (int i = 0; i < firstOrDefault.Access.Count; i++)
                    {
                        Access access = firstOrDefault.Access[i];

                        switch (access.TypeAccess)
                        {
                        case tTypeAccess.Delete:
                            u2c.Delete = true;
                            break;

                        case tTypeAccess.Execute:
                            u2c.Execute = true;
                            break;

                        case tTypeAccess.Full:
                            u2c.Full = true;
                            break;

                        case tTypeAccess.Insert:
                            u2c.Insert = true;
                            break;

                        case tTypeAccess.Read:
                            u2c.Read = true;
                            break;

                        case tTypeAccess.Update:
                            u2c.Update = true;
                            break;
                        }
                    }
                }

                permissions.Add(u2c);
            }

            if (IsPostBack)
            {
                #region Save Class Permissions

                List <Permissions> list = new List <Permissions>();

                foreach (Subject @class in _allClasses)
                {
                    string fullKey    = "Full" + @class.__PrimaryKey;
                    string readKey    = "Read" + @class.__PrimaryKey;
                    string insertKey  = "Insert" + @class.__PrimaryKey;
                    string updateKey  = "Update" + @class.__PrimaryKey;
                    string deleteKey  = "Delete" + @class.__PrimaryKey;
                    string executeKey = "Execute" + @class.__PrimaryKey;

                    bool isClassPermissionsSet = false;

                    Permissions permission = new Permissions();
                    permission.ObjectId   = @class.__PrimaryKey.ToString();
                    permission.ObjectName = @class.Name;

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(fullKey)))
                    {
                        permission.Full       = true;
                        isClassPermissionsSet = true;
                    }

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(readKey)))
                    {
                        permission.Read       = true;
                        isClassPermissionsSet = true;
                    }

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(insertKey)))
                    {
                        permission.Insert     = true;
                        isClassPermissionsSet = true;
                    }

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(updateKey)))
                    {
                        permission.Update     = true;
                        isClassPermissionsSet = true;
                    }

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(deleteKey)))
                    {
                        permission.Delete     = true;
                        isClassPermissionsSet = true;
                    }

                    if (Request.Form.AllKeys.Any(fk => fk.Contains(executeKey)))
                    {
                        permission.Execute    = true;
                        isClassPermissionsSet = true;
                    }

                    if (isClassPermissionsSet)
                    {
                        list.Add(permission);
                    }
                }



                List <Permissions> updatedPermissions = new List <Permissions>();
                List <Permissions> deletedPermissions = new List <Permissions>();

                foreach (Permissions p in permissions)
                {
                    Permissions singleOrDefault = list.SingleOrDefault(c => c.ObjectId.Equals(p.ObjectId));

                    if (singleOrDefault != null)
                    {
                        updatedPermissions.Add(singleOrDefault);
                        list.Remove(singleOrDefault);
                    }
                    else
                    {
                        deletedPermissions.Add(p);
                    }
                }

                List <Permissions> addedPermissions = list.Union(updatedPermissions).ToList();



                List <DataObject> deletedObjects = new List <DataObject>();
                List <DataObject> addedObjects   = new List <DataObject>();

                foreach (Permition p in userOwnClasses)
                {
                    string classId = p.Subject.__PrimaryKey.ToString();

                    if (updatedPermissions.Any(x => x.ObjectId.Equals(classId)) ||
                        deletedPermissions.Any(x => x.ObjectId.Equals(classId)))
                    {
                        p.SetStatus(ObjectStatus.Deleted);
                        deletedObjects.Add(p);
                    }
                }

                foreach (Permissions p in addedPermissions)
                {
                    Permition permission = new Permition();

                    permission.Agent   = DataObject;
                    permission.Subject = new Subject();
                    permission.Subject.SetExistObjectPrimaryKey(p.ObjectId);

                    permission.Access = new DetailArrayOfAccess(permission);

                    if (p.Delete)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Delete
                        });
                    }

                    if (p.Execute)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Execute
                        });
                    }

                    if (p.Full)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Full
                        });
                    }

                    if (p.Insert)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Insert
                        });
                    }

                    if (p.Read)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Read
                        });
                    }

                    if (p.Update)
                    {
                        permission.Access.Add(new Access()
                        {
                            TypeAccess = tTypeAccess.Update
                        });
                    }

                    addedObjects.Add(permission);
                }

                DataObject[] dataObjects = deletedObjects.Union(addedObjects).ToArray();

                if (dataObjects.Length > 0)
                {
                    BridgeToDS.GetDataService().UpdateObjects(ref dataObjects);
                }

                #endregion
            }

            GenerateClassesTable(permissions);
        }
        // *** Start programmer edit section *** (ЗаказBS CustomMembers)

        // *** End programmer edit section *** (ЗаказBS CustomMembers)


        // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes)

        // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes)
        public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(IIS.АСУ_Кондитерская.Заказ UpdatedObject)
        {
            // *** Start programmer edit section *** (OnUpdateЗаказ)
            if (UpdatedObject.IsAlteredProperty("Состояние") && UpdatedObject.Состояние == СостояниеЗаказа.Выполненный)
            {
                // 1) проверить, достаточно ли на складе продуктов для отправки в торговую точку
                // 2) в случае успеха создать объекты ПродуктНаПродажу в торговой точке
                //    и осуществить декрементацию продуктов на складе
                // 3) заблокировать изменение статуса

                // ------------------------- ПРОВЕРКА -----------------------------
                IDataService        ds  = DataService;
                var                 lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), "СтрокаЗаказаE");
                SQLWhereLanguageDef ld  = SQLWhereLanguageDef.LanguageDef;
                lcs.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                   new VariableDef(ld.GuidType, Information.ExtractPropertyPath <СтрокаЗаказа>(x => x.Заказ)), UpdatedObject.__PrimaryKey);
                var order_points = ds.LoadObjects(lcs);

                foreach (var point in order_points)
                {
                    var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey;

                    // Загружаем требуемые продукты, которые хранятся на складе в цехе
                    var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE");
                    lcs2.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                        new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key);
                    var complete_products = ds.LoadObjects(lcs2);

                    // Посчитаем, сколько готовых продуктов (с разной датой изготовления) содержится на складе
                    int total_count = 0;
                    foreach (var comp_prod in complete_products)
                    {
                        total_count += ((ГотовыйПродукт)comp_prod).НаСкладе;
                    }

                    // Если продукции меньше, чем требуется в заказе, то кидаем исключение
                    if (total_count < ((СтрокаЗаказа)point).Количество)
                    {
                        throw new Exception(((СтрокаЗаказа)point).Продукт.Наименование.ToString() + ". На складе - " + total_count.ToString() + ". Требуется - " +
                                            ((СтрокаЗаказа)point).Количество.ToString() + ". Перевод заказа в статус \"Выполненный\" невозможно.");
                    }
                }
                // ------------------------- ПРОВЕРКА ЗАВЕРШЕНА -----------------------------

                // --------------------- ОТПРАВКА ПРОДУКТОВ В ТОРГОВУЮ ТОЧКУ -----------------
                List <DataObject> forupdate = new List <DataObject>();
                foreach (var point in order_points)
                {
                    var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey;

                    // Загружаем требуемые продукты, которые хранятся на складе в цехе
                    var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE");
                    lcs2.LimitFunction = ld.GetFunction(ld.funcAND,
                                                        ld.GetFunction(ld.funcEQ,
                                                                       new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key),
                                                        ld.GetFunction(ld.funcNEQ,
                                                                       new VariableDef(ld.NumericType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.НаСкладе)), 0));
                    var complete_products = ds.LoadObjects(lcs2);

                    // Отсортируем все продукты по дате изготовления и будем отправлять по мере "старения" продуктов
                    Array.Sort(complete_products);
                    int req_count = ((СтрокаЗаказа)point).Количество;   // требуемое в заказе количество продукта
                    int i         = 0;                                  // счетчик продукта в списке
                    while (req_count != 0)
                    {
                        int sklad_count = ((ГотовыйПродукт)complete_products[i]).НаСкладе;
                        if (req_count <= sklad_count)
                        {
                            // Создаем детейл для торговой точки
                            var sale_product = new ПродуктНаПродажу()
                            {
                                ДатаИзг       = ((ГотовыйПродукт)complete_products[i]).ДатаИзг,
                                Поступило     = req_count,
                                Осталось      = req_count,
                                ТорговаяТочка = UpdatedObject.ТорговаяТочка,
                                Продукт       = ((СтрокаЗаказа)point).Продукт
                            };
                            sale_product.SetStatus(ObjectStatus.Created);

                            // Обновляем инф-цию на складе
                            ((ГотовыйПродукт)complete_products[i]).НаСкладе -= req_count;
                            complete_products[i].SetStatus(ObjectStatus.Altered);

                            req_count = 0;
                            forupdate.Add(sale_product);
                            forupdate.Add(((ГотовыйПродукт)complete_products[i]));
                        }
                        else // (req_count > sklad_count)
                        {
                            // Создаем детейл для торговой точки
                            var sale_product = new ПродуктНаПродажу()
                            {
                                ДатаИзг       = ((ГотовыйПродукт)complete_products[i]).ДатаИзг,
                                Поступило     = sklad_count,
                                Осталось      = sklad_count,
                                ТорговаяТочка = UpdatedObject.ТорговаяТочка,
                                Продукт       = ((СтрокаЗаказа)point).Продукт
                            };
                            sale_product.SetStatus(ObjectStatus.Created);

                            // Обновляем инф-цию на складе
                            ((ГотовыйПродукт)complete_products[i]).НаСкладе = 0;
                            complete_products[i].SetStatus(ObjectStatus.Altered);

                            req_count -= sklad_count;
                            forupdate.Add(sale_product);
                            forupdate.Add(((ГотовыйПродукт)complete_products[i]));
                        }
                        // Переходим к следующему продукту (более свежему)
                        i++;
                    }
                }
                // --------------------- ПРОДУКТЫ ОТПРАВЛЕНЫ В ТОРГОВУЮ ТОЧКУ -----------------
                UpdatedObject.ДатаПоступления = DateTime.Now;
                return(forupdate.ToArray());
            }
            return(new ICSSoft.STORMNET.DataObject[0]);
            // *** End programmer edit section *** (OnUpdateЗаказ)
        }
Exemple #18
0
        // *** Start programmer edit section *** (ПроверкаНаличияТоваров CustomMembers)

        // *** End programmer edit section *** (ПроверкаНаличияТоваров CustomMembers)


        // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes)

        // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes)
        public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(АСУ_Склад.Заказ UpdatedObject)
        {
            // *** Start programmer edit section *** (OnUpdateЗаказ)

            // Определим массив, который будем возвращать для обновления.
            DataObject[] ret = new DataObject[0];

            // Проверим  на  то,  что  пришедший  объект  -  это	именно то, что нам нужно (создан или изменён и статус установлен в Оплачено).
            if ((UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Created || UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Altered) && Array.IndexOf(UpdatedObject.GetAlteredPropertyNames(), "Статус") >= 0 && UpdatedObject.Статус == Состояние_Заказа.Оплаченный)
            {
                // Построим ограничение и вычитаем все объекты ТоварНаСкладе, которые нам подходят.
                Заказ заказ = UpdatedObject;
                SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
                ICSSoft.STORMNET.FunctionalLanguage.Function lf = null;

                for (int i = 0; i < заказ.Строка_Заказа.Count; i++)
                {
                    if (lf != null)
                    {
                        if (заказ.Строка_Заказа[i].Товар != null)
                        {
                            lf = langdef.GetFunction(langdef.funcOR, lf, langdef.GetFunction(langdef.funcEQ,
                                                                                             new VariableDef(langdef.GuidType, "Товар"),
                                                                                             заказ.Строка_Заказа[i].Товар.__PrimaryKey));
                        }
                    }

                    else
                    {
                        if (заказ.Строка_Заказа[i].Товар != null)
                        {
                            lf = langdef.GetFunction(langdef.funcEQ,
                                                     new VariableDef(langdef.GuidType, "Товар"),
                                                     заказ.Строка_Заказа[i].Товар.__PrimaryKey);
                        }
                    }
                }

                ICSSoft.STORMNET.Business.LoadingCustomizationStruct lcs = ICSSoft.STORMNET.Business.LoadingCustomizationStruct.GetSimpleStruct(typeof(Товар_на_Складе), "ТоварНаСкладеE");
                lcs.LimitFunction = lf;
                ICSSoft.STORMNET.DataObject[] objs = ICSSoft.STORMNET.Business.DataServiceProvider.DataService.LoadObjects(lcs);

                // Разместим вычитанные объекты в отсортированном списке для удобного доступа в дальнейшем.
                System.Collections.SortedList sl = new System.Collections.SortedList();

                //for (int i = 0; i < objs.Length; i++)
                //{
                //    if (sl.ContainsKey(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey))
                //    {
                //        ((System.Collections.ArrayList)sl[objs[i].__PrimaryKey]).Add(objs[i]);
                //    }
                //    else
                //    {
                //        System.Collections.ArrayList списокТоваров = new System.Collections.ArrayList();
                //        списокТоваров.Add(objs[i]);
                //        sl.Add(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey, списокТоваров);
                //    }
                //}

                // Определим строчку для сообщения об ошибке.
                string    errStr  = string.Empty;
                ArrayList retObjs = new ArrayList();

                // Проверим наличие товара на складах, если не хватает, то выдадим сообщение об ошибке, если хватает, то вычитаем количество.
                for (int i = 0; i < заказ.Строка_Заказа.Count; i++)
                {
                    if (sl.ContainsKey(заказ.Строка_Заказа[i].Товар.__PrimaryKey))
                    {
                        ArrayList arl = ((System.Collections.ArrayList)sl[заказ.Строка_Заказа[i].Товар.__PrimaryKey]);

                        int количествоНаСкладах = 0; for (int j = 0; j < arl.Count; j++)
                        {
                            количествоНаСкладах +=
                                ((Товар_на_Складе)arl[j]).Количество;
                        }

                        if (количествоНаСкладах <
                            заказ.Строка_Заказа[i].Количество)
                        {
                            errStr += " Не хватает товара \"" + заказ.Строка_Заказа[i].Товар.Название + "\" в наличии: " + количествоНаСкладах + ", требуется " + заказ.Строка_Заказа[i].Количество + Environment.NewLine;
                        }
                        else
                        {
                            int колич = заказ.Строка_Заказа[i].Количество;
                            for (int j = 0; j < arl.Count; j++)
                            {
                                if (колич > 0 &&
                                    ((Товар_на_Складе)arl[j]).Количество > колич)
                                {
                                    ((Товар_на_Складе)arl[j]).Количество -= колич;
                                    колич = 0; retObjs.Add(arl[j]);
                                }
                                else
                                {
                                    if (колич > 0)
                                    {
                                        колич -= ((Товар_на_Складе)arl[j]).Количество;
                                        ((Товар_на_Складе)arl[j]).Количество = 0;
                                        retObjs.Add(arl[j]);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        errStr += "Товар	\""+
                                  заказ.Строка_Заказа[i].Товар.Название + "\" в наличии отсутствует." + Environment.NewLine;
                    }
                }

                // В случае, если чего-то не хватило, сообщаем об этом пользователю.
                if (errStr != string.Empty)
                {
                    throw new Exception(errStr);
                }

                // Если всё нормально, то возвращаем массив объектов, которые надо обновить.
                ret = new DataObject[retObjs.Count]; retObjs.CopyTo(ret, 0);
            }
            return(ret);

            // *** End programmer edit section *** (OnUpdateЗаказ)
        }