// *** 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))) { }