// *** End programmer edit section *** (OrderBS CustomMembers)


        // *** Start programmer edit section *** (OnUpdateOrder CustomAttributes)


        // *** End programmer edit section *** (OnUpdateOrder CustomAttributes)
        public virtual DataObject[] OnUpdateOrder(IIS.Shop.Order UpdatedObject)
        {
            // *** Start programmer edit section *** (OnUpdateOrder)
            DataObject[] result = new DataObject[0];

            if ((UpdatedObject.GetStatus() == ObjectStatus.Created ||
                 UpdatedObject.GetStatus() == ObjectStatus.Altered) &&
                Array.IndexOf(UpdatedObject.GetAlteredPropertyNames(), "Status") >= 0 &&
                UpdatedObject.Status == OrderStatus.Paid)
            {
                result = changeOrderStatusPaid(UpdatedObject);
            }

            return(result);
            // *** End programmer edit section *** (OnUpdateOrder)
        }
        // *** Start programmer edit section *** (OrderBS CustomMembers)

        /// <summary>
        /// Перевод заказа в статус "Оплачено"
        /// </summary>
        /// <param name="UpdatedObject">Заказ</param>
        /// <returns>Список измененных объектов (заказ + товары на складе)</returns>
        private static DataObject[] changeOrderStatusPaid(IIS.Shop.Order UpdatedObject)
        {
            // Определим массив, который будем возвращать для обновления.
            DataObject[] ret = new DataObject[0];

            // Построим ограничение и вычитаем все объекты StoreProduct, которые нам подходят.
            Order    order = UpdatedObject;
            Function lf    = null;

            for (int i = 0; i < order.OrderItem.Count; i++)
            {
                Function storeProduct = FunctionBuilder.BuildEquals <StoreProduct>(x => x.Product, order.OrderItem[i].Product);
                if (order.OrderItem[i].Product != null)
                {
                    lf = lf == null ? storeProduct : FunctionBuilder.BuildOr(lf, storeProduct);
                }
            }

            LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(StoreProduct), "StoreProductE");

            lcs.LimitFunction = lf;

            // Сортировка по номеру склада
            var sortColumns = new List <ColumnsSortDef>();

            sortColumns.Add(new ColumnsSortDef("Storehouse.Number", SortOrder.Asc));
            lcs.ColumnsSort = sortColumns.ToArray();

            DataObject[] objs = DataServiceProvider.DataService.LoadObjects(lcs);

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

            for (int i = 0; i < objs.Length; i++)
            {
                var       primaryKey = ((StoreProduct)objs[i]).Product.__PrimaryKey;
                ArrayList productList;
                if (sl.ContainsKey(primaryKey))
                {
                    productList = (ArrayList)sl[primaryKey];
                    productList.Add(objs[i]);
                }
                else
                {
                    productList = new ArrayList();
                    productList.Add(objs[i]);
                    sl.Add(primaryKey, productList);
                }
            }

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

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

                    int productTotalCount = 0;
                    for (int j = 0; j < arl.Count; j++)
                    {
                        productTotalCount += ((StoreProduct)arl[j]).Amount;
                    }

                    if (productTotalCount < order.OrderItem[i].Amount)
                    {
                        errStr += " Не хватает товара \"" + order.OrderItem[i].Product.Name
                                  + "\" в наличии: " + productTotalCount
                                  + ", требуется " + order.OrderItem[i].Amount
                                  + Environment.NewLine;
                    }
                    else
                    {
                        int count = order.OrderItem[i].Amount;
                        for (int j = 0; j < arl.Count; j++)
                        {
                            if (count > 0 && ((StoreProduct)arl[j]).Amount > count)
                            {
                                ((StoreProduct)arl[j]).Amount -= count;
                                count = 0;
                                retObjs.Add(arl[j]);
                            }
                            else if (count > 0)
                            {
                                count -= ((StoreProduct)arl[j]).Amount;
                                ((StoreProduct)arl[j]).SetStatus(ObjectStatus.Deleted);
                                retObjs.Add(arl[j]);
                            }
                        }
                    }
                }
                else
                {
                    errStr += "Товар	\""+
                              order.OrderItem[i].Product.Name + "\" в наличии отсутствует." + Environment.NewLine;
                }

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

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

            return(ret);
        }
        // *** Start programmer edit section *** (IIS.Shop.DetailArrayOfOrderItem members)

        // *** End programmer edit section *** (IIS.Shop.DetailArrayOfOrderItem members)


        /// <summary>
        /// Construct detail array.
        /// </summary>
        /// <summary>
        /// Returns object with type OrderItem by index.
        /// </summary>
        /// <summary>
        /// Adds object with type OrderItem.
        /// </summary>
        public DetailArrayOfOrderItem(IIS.Shop.Order fOrder) :
            base(typeof(OrderItem), ((ICSSoft.STORMNET.DataObject)(fOrder)))
        {
        }